我正在尝试使用 API。我需要做某种类型的“for 循环”来替换或利用 2 个变量......
在伪..
# 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
如果两个数组的长度相同,并且您只想能够访问每个数组中的相同索引,则以下是一个示例:
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。