如何读取 Bash 中的多个数组并在第一次匹配后跳过数组

How to read multiple arrays in Bash and skip the array after first match

这是我的bash脚本

我有 4 组数组,在每组中我都通过 SSH 连接到每台服务器以查找 /data 文件系统是否存在。如果它匹配,它应该跳过数组并移动到下一个数组。我无法处理中断,因为它退出了整个脚本。有什么想法吗?

 declare -a siteA=("server01" "server02" "server03")
 declare -a siteB=("server04" "server05" "server06")
 declare -a siteB=("server07" "server08" "server09")
 declare -a siteB=("server10" "server11" "server12")

 cmd=$(df -h|grep /data)

 for i in "${siteA[@]}" "${siteB[@]}" "${siteC[@]}" "${siteD[@]}"; do

    ping -c 2 ${i} > /dev/null 2>&1

    if [[ $? -eq 0 ]] ; then

         X=$(ssh root@${i} -q $cmd1 2>&1)

         if [[ $Z == "/data" ]]; then

             echo "$i: has /data"

         fi

   fi

 done

要在找到匹配项时继续下一个数组,只需将循环内容包装在函数内的参数循环中,然后为每个站点调用它:

has_running_host() {
    for host
    do
        [code which `break`s on a match]
    done
}
has_running_host "${siteA[@]}"
has_running_host "${siteB[@]}"
[…]

虽然不是很好,但您可以将两个循环与 eval 结合使用:

for j in siteA siteB siteC siteD; do
    for i in $(eval echo ${${j}[@]}); do
        echo $i
    done
done

这将允许您在内部循环中使用 break,从而跳转到下一个数组

这对我有用,从远程 ssh 获取输出也是一个挑战