我有两个服务器组 SERVERS_CA 和 SERVERS_NY。
我将有一个类似 SERVERGROUP=(CA NY) 的数组
CA 和 NY 将拥有一组服务器,如下图所示
钙调=(钙调126 钙调546 钙调642)
纽约=(ny112 ny113 ny114)
我的脚本要做的是检查运行脚本的服务器的主机名是否与哪个组匹配。
假设服务器的 HOSTNAME 在 CA 数组中,那么它应该显示类似 SERVERGROUP IS CALIFORNIA 的内容
对于此脚本,循环应该有 break 语句,并且一旦发现所需的服务器组就不会执行整个循环,就应该退出循环。
如果有人能帮我写这个脚本,那将会很有帮助。谢谢
答案1
在 Bash 中,数组的数组确实非常痛苦
host=ny113
for grp in "${SERVERGROUP[@]}"; do
ref="${grp}[@]"
for srv in "${!ref}"; do
if [[ $host == $srv ]]; then
echo $host is in $grp
break 2
fi
done
done
ny113 is in NY
使用关联数组(bash 版本 4)是另一种方法:
declare -A grps
grps[CA]="ca126 ca546 ca 642"
grps[NY]="ny112 ny113 ny114"
for grp in "${!grps[@]}"; do
# all quotes and spaces are very deliberate in next command
if [[ " ${grps[$grp]} " == *" $host "* ]]; then
echo $host is in $grp
break
fi
done
或者,你可以建立一个“反向地图”
declare -A host2group
for grp in "${SERVERGROUP[@]}"; do
ref="${grp}[@]"
for srv in "${!ref}"; do
host2group[$srv]=$grp
done
done
echo $host is in ${host2group[$host]}
ny113 is in NY