我试图在 for 循环中创建两个 if 条件。这可能吗?现在不从 first返回任何第二个if只有两个。OKif
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
fi
if [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 2 ]; then
echo "NOT - OK"
fi
done
Run Code Online (Sandbox Code Playgroud)
对于IP列表中的第三个必须返回,NOT - OK因为它不在线。但输出是这样的
root@ubuntu:~$ ./check.sh
OK
OK
root@ubuntu:~$
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
更新:
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
fi
done
if [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 0 ]; then
echo "NOT - OK"
fi
Run Code Online (Sandbox Code Playgroud)
如果我把它放在 for 循环之外,它必须工作吗?
例如,将主机、IP 地址放入文件中。
hosts.txt包含以下内容
212.39.82.157
212.39.82.155
1.1.1.1
22.22.22.22
Run Code Online (Sandbox Code Playgroud)
创建脚本。
#!/bin/bash
ping_hosts(){
echo
echo "*** Ping all hosts ***"
echo "--------------------------------------------"
count1=0
count2=0
start=$(date +"%d-%m-%Y-%T")
hosts=( 1.1.1.1 2.3.3.4 4.5.6.6 )
while read -r line
do
#PING=`ping -s 64 $line -c 1 | grep packet | awk '{print $(NF-2)}'`
PING=$(ping -s 64 $line -c 1 | grep packet | awk '{print $(NF-4)}')
if [[ "$PING" == "0%" ]]; then
count1=$((count1 + 1))
printf '%s\n' "$line UP"
else
count2=$((count2 + 1))
printf '%s\n\n' "$line DOWN"
fi
done < <( printf '%s\n' "${hosts[@]}")
end=$(date +"%d-%m-%Y-%T")
printf '%s\n' "Start:$start"
printf '%s\n\n' "End**:$end"
printf '%s\n' "$count1 hosts UP and $count2 hosts down"
}
ping_hosts
Run Code Online (Sandbox Code Playgroud)
现在使脚本可执行并运行它。可能它违背了你想要的目的。只是想分享一下。
更新你的答案
#!/bin/bash
servers=("212.39.82.157" "212.39.82.157" "1.1.1.1")
for i in "${servers[@]}"; do
ping -c 1 $i > /dev/null
if [ $? -eq 0 ]; then
echo "OK"
elif [ $(netstat -na | grep ':3708' | grep ESTABLISH | wc -l) -eq 0 ]; then
echo "NOT - OK"
fi
done
Run Code Online (Sandbox Code Playgroud)
附带说明一下,您的脚本在 bash 语法方面写得很差。