在 bash 脚本中循环使用 2 个变量

我正在尝试使用 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

我只是要求它遍历列出的每一台主机。

2
2022-06-07 14:40:44
资源 分享
答案: 4

如果您的两个品种的大小相同,并且您只是希望能够访问每个品种中的相同索引,那么这里是一个实例:

for ((i=0; i < ${#newserver[@]}; i++)); do 
  echo ${newserver[i]} ${newhostname[i]};
done;
4
2022-06-07 15:12:19
资源

你的数组和:

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
2
2022-06-07 15:11:24
资源

标准没有很好地指定,但这就是如何肯定会这样做:

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

优点:

  • 明确哪个 Web 服务器名称对应哪个 fqdn
  • 它纯粹的 bash 并没有使用任何外部的东西

如果 Web 服务器名称总是最有可能是 fqdn 的第一部分,则数组也可以更简单,您也可以在 fqdn 中使用 bash 编号服务器名称。

4
2022-06-07 15:11:20
资源

如果您使用 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

1
2022-06-07 15:10:19
资源