Loop com 2 variáveis em um script bash

2

Estou tentando utilizar uma API. Eu preciso fazer algum tipo de "loop for" que substitua ou utilize 2 variáveis ...

No pseudo ..

# Declare New Servers
newserver=(
box001
box002
box003
box004
box005
)


# Declare hostnames
newhostname=(
box001.domain.com
box002.domain.com
box003.domain.com
box004.domain.com
box005.domain.com
)

Eu preciso substituir NEWSERVER e NEWHOSTNAME em

http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120

para que pareça com isso

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.zcloud.com&targetid=3120

Eu só preciso disso para percorrer todos os hosts listados.

    
por LVLAaron 12.06.2012 / 21:41

4 respostas

3

O critério não está bem definido, mas é assim que I faria:

hosts=(
box001:box001.domain.com
box002:box002.domain.com
box003:box003.domain.com
box004:box004.domain.com
box005:box005.domain.com
)

uri="http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120"

for host in "${hosts[@]}"; do
    IFS=":" names=( $host )
    hosturi="${uri/NEWSERVER/${names[0]}}"
    hosturi="${hosturi/NEWHOSTNAME/${names[1]}}"
    echo "$hosturi"
done

Saídas:

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box002&host=box002.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box003&host=box003.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box004&host=box004.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box005&host=box005.domain.com&targetid=3120

Vantagens:

  • Mantém claro qual nome de servidor corresponde a qual fqdn.
  • Sua pura festança & não usa nada externo.

.

Se o nome do servidor for sempre a primeira parte do fqdn, o array pode ser ainda mais simples e você pode ter o bash para descobrir o nome do servidor a partir do fqdn.

    
por 13.06.2012 / 02:07
3

Se os dois arrays tiverem o mesmo tamanho e você quiser acessar o mesmo índice em cada um deles, aqui está um exemplo:

for ((i=0; i < ${#newserver[@]}; i++)); do 
  echo ${newserver[i]} ${newhostname[i]};
done;
    
por 12.06.2012 / 21:54
1

Suas matrizes acima e:

url="http://server/api/duplicateobject.htm?id=2928&name=NEWSERVER&host=NEWHOSTNAME&targetid=3120"
for ((i=0; i < ${#newserver[@]}; i++));
do
   echo $url | sed 's/NEWSERVER/'${newserver[i]}'/;s/NEWHOSTNAME/'${newhostname[i]}'/'
done

leva a:

http://server/api/duplicateobject.htm?id=2928&name=box001&host=box001.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box002&host=box002.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box003&host=box003.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box004&host=box004.domain.com&targetid=3120
http://server/api/duplicateobject.htm?id=2928&name=box005&host=box005.domain.com&targetid=3120
    
por 13.06.2012 / 01:58
1

Se você estiver usando bash , poderá usar matrizes associativas:

declare -A servers
servers=(
    [box001]=box001.domain.com
    [box002]=box002.domain.com
    [box003]=box003.domain.com
    [box004]=box004.domain.com
    [box005]=box005.domain.com
)

for server in "${!servers[@]}" ; do
    hostname="${servers[$server]}"
    # do something with $server and $hostname
done

A ordem em que você itera os servidores não está definida. Para o exemplo acima na minha versão do bash no meu host, o pedido é box001, box003, box002, box005 e box004. YMMV.

    
por 13.06.2012 / 12:33