Цикл с 2 переменными в сценарии удара

for array_item in "${my_array[@]}"
do 
    ...
done

или

for idx in $(seq ${#my_array})
do
    array_item="${my_array[$idx]}"
done
2
13.06.2012, 01:43
4 ответа

Критерии не определяются, что хорошо, но это - то, как я сделал бы это:

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

Выводы:

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

Преимущества:

  • Сохраняет это ясным, какое имя сервера соответствует который fqdn.
  • Его чистый удар и использование, не внешнее что-либо.

.

Если имя сервера всегда будет первой частью fqdn, массив может быть еще более простым, и у Вас может быть число удара имя сервера из fqdn.

3
27.01.2020, 21:51

Если и Ваши массивы являются той же длиной, и Вы просто хотите смочь, получают доступ к тому же индексу в каждом, вот пример:

for ((i=0; i < ${#newserver[@]}; i++)); do 
  echo ${newserver[i]} ${newhostname[i]};
done;
3
27.01.2020, 21:51

Ваш выше массивов и:

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

приводит к:

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
1
27.01.2020, 21:51

Если Вы используете bash, можно использовать ассоциативные массивы:

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

Порядок, что Вы выполняете итерации серверов, не определяется. Для вышеупомянутого примера в моей версии удара на моем хосте порядок является box001, box003, box002, box005 и box004. YMMV.

1
27.01.2020, 21:51

Теги

Похожие вопросы