Bashスクリプトで2つの変数を繰り返します。

Bashスクリプトで2つの変数を繰り返します。

APIを使用しようとしています。 2つの変数を置換または活用するには、一種の「forループ」を実行する必要があります。

偽物で...

# 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
)

NEWSERVERとNEWHOSTNAMEを交換する必要があります。

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

だからそれは

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

リストされているすべてのホストを繰り返すために必要です。

答え1

標準は明確に定義されていませんが、ここには次のようなものがあります。します:

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に対応するかを明確に確認してください。
  • 純粋なbashで、外部エントリを使用しません。

サーバー名が常にFQDNの最初の部分である場合、配列はより簡単になり、bashにFQDNからサーバー名を計算させることができます。

答え2

2つの配列の長さが同じで、各配列の同じインデックスにアクセスできるようにしたい場合は、次の例を参照してください。

for ((i=0; i < ${#newserver[@]}; i++)); do 
  echo ${newserver[i]} ${newhostname[i]};
done;

答え3

上記の配列の合計:

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

答え4

以下を使用する場合は、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

サーバーが繰り返される順序は定義されていません。上記の例では、私のホストコンピュータのbashバージョンでは、順序はbox001、box003、box002、box005、およびbox004です。 YMMV。

関連情報