将循环转换为while循环比较数组

有时候(例如8小时轮换4次或5次),我必须检查从共享服务器提供的站点是否正在加载。 我目前有一个脚本来做到这一点,但是我使用嵌套for循环遍历两个数组,以确保我只是检查实际上从服务器提供服务的网站。 我一直在阅读和发现,这种方法可能会有问题,但不能弄清楚如何把它们变成while循环或其他方法。 我设置了两个数组,其中一个是所有的站点,以及挖出来的IP地址,以及来自curl的状态码(203.0.113.231 – foobar.com – Status_code = 200)。 另一个arrays是服务器上的所有IP。 然后将第一个数组与第二个数组进行比较,仅打印第一个数组中第二个数组中的元素。

#!/bin/bash _ORGIFS=$IFS IFS=$'\n' _sitecrls=($( for _x in $(grep 'ServerName' /etc/httpd/conf.d/vhost_* |grep -v '000_defaults' |uniq |awk '{print $NF}'); do printf "%s %s %s %s %s\n" "$(dig +short $_x |head -n1) - $_x - Status_code=$(curl -so /dev/null -w %{http_code} $_x)" | sed '/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/!d'; done )) _ips=($(ip a |sed -e 's/^[ \t]*//g' -e '/inet /!d' -e '/127.0.0.1/d' -e 's/inet //g' |cut -d'/' -f1)) echo for _x in "${_sitecrls[@]}" do for _z in "${_ips[@]}" do echo "$_x" |sed -n "/$_z/p" done done echo IFS=$_ORGIFS 

设置IFS的方式是将命令输出分解为元素的好方法。 然后,使用迭代数组元素是一个完美的。

我不太喜欢你的代码,但我想知道这是更容易维护:

 #!/bin/bash IFS=$'\n' ips=( $( ip a | sed -n '/\<inet\>/ { /127\.0\.0\.1/! s,.*inet \([^/]*\)/.*,\1,p }' ) ) hosts=( $( awk ' /ServerName/ && !/000_defaults/ && !seen[$NF]++ {print $NF} ' /etc/httpd/conf.d/vhost_* ) ) for host in "${hosts[@]}"; do domain=$( dig +short $host | head -n1 ) status=$( curl -so /dev/null -w '%{http_code}' $host ) found=false for ip in "${ips[@]}"; do if [[ $domain == $ip ]]; then echo "$domain - $host - Status_code=$code" found=true break fi done if ! $found; then echo "no IP found for $domain - $host - Status_code=$code" >&2 fi done