macos bash 似乎忽略了 elif 并且只有第一个 if 语句按预期工作
macos bash seems to ignore elif and only the first if statement works as intended
我一直在努力弄清楚我在这里做错了什么。我将一些代码放在一起以帮助对我们的服务器执行 ping 操作,效果很好,但它只打印天气或不显示节点是否已启动,除非你有 ip 的记忆需要查找它去哪个服务器。所以最近我决定更新它,这样它会打印出不同的字符串,如果对于每个节点,第一个工作得很好但是对于示例中的第二个节点(使用 elif)它似乎跳过它导致它说节点下线了。
我认为这与我如何向 "test" 添加多个条件有关
我已经尝试了几种不同的方法来添加条件,但它们也有问题。
这是我的代码片段:
DIR="/path/to/working/directory"
PING_SERVERS() {
tput smso
echo "`tput setaf 3` Pinging Servers... `tput setaf 7`"
tput rmso
sleep 1
#######
cat $DIR/servers.txt | while read output
do
ping -c 2 -t 2 "$output" > /dev/null
if [[ "$output" == "10.5.0.13" ]] && [[ $? -eq 0 ]]; then
echo "`tput setaf 2` node "$output" is up //Server1`tput setaf 7`"
elif [[ "$output" == "10.5.0.30" ]] && [[ $? -eq 0 ]]; then
echo "`tput setaf 2` node "$output" is up //Server2`tput setaf 7`"
else
echo "`tput setaf 1` node "$output" is down `tput setaf 7`"
fi
done
echo " Done pinging servers"
}
PING_SERVERS
echo ""
ping -c 2 -t 2 10.5.0.13 #just to show they are up while debuging
sleep 2
echo ""
ping -c 2 -t 2 10.5.0.30 #just to show they are up while debuging
sleep 5
exit
这是它在终端中给我的信息:
Pinging Servers...
node 10.5.0.13 is up //Server1
node 10.5.1.30 is down
Done pinging servers
PING 10.5.0.13 (10.5.0.13): 56 data bytes
64 bytes from 10.5.0.13: icmp_seq=0 ttl=64 time=1.731 ms
64 bytes from 10.5.0.13: icmp_seq=1 ttl=64 time=3.382 ms
--- 10.5.0.13 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.731/2.557/3.382/0.825 ms
PING 10.5.0.30 (10.5.0.30): 56 data bytes
64 bytes from 10.5.0.30: icmp_seq=0 ttl=64 time=2.151 ms
64 bytes from 10.5.0.30: icmp_seq=1 ttl=64 time=2.783 ms
--- 10.5.0.30 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.151/2.467/2.783/0.316 ms
感谢任何帮助。
杰森
@那个人
我猜我应该刷新一下,你是对的,我在尝试让它工作时搞砸了,谢谢。
在这里插入 facepalm,我明白了。事实证明这只是我盯着它看太久导致我看不到它的用户错误。
在重读我的原作 post 几次尝试解决更多问题后,我意识到 elif 检查的第二台主机与我在文件中尝试 ping 的主机不同。
第一台主机是 10.5.0.13 所以我假设我要检查的第二台主机是 10.5.0.30 并设置我的 elif 语句来检查它。然而事实证明(正如您在我 posted 的终端输出中看到的那样)它实际上是 10.5.1.30!
如果我没有 post 回答这个问题,我可能无法弄清楚,(尽管现在我再也不能在这里露面了)。感谢语法建议,我会稍微清理一下我的代码。
再次感谢,
杰森
我一直在努力弄清楚我在这里做错了什么。我将一些代码放在一起以帮助对我们的服务器执行 ping 操作,效果很好,但它只打印天气或不显示节点是否已启动,除非你有 ip 的记忆需要查找它去哪个服务器。所以最近我决定更新它,这样它会打印出不同的字符串,如果对于每个节点,第一个工作得很好但是对于示例中的第二个节点(使用 elif)它似乎跳过它导致它说节点下线了。
我认为这与我如何向 "test" 添加多个条件有关 我已经尝试了几种不同的方法来添加条件,但它们也有问题。
这是我的代码片段:
DIR="/path/to/working/directory"
PING_SERVERS() {
tput smso
echo "`tput setaf 3` Pinging Servers... `tput setaf 7`"
tput rmso
sleep 1
#######
cat $DIR/servers.txt | while read output
do
ping -c 2 -t 2 "$output" > /dev/null
if [[ "$output" == "10.5.0.13" ]] && [[ $? -eq 0 ]]; then
echo "`tput setaf 2` node "$output" is up //Server1`tput setaf 7`"
elif [[ "$output" == "10.5.0.30" ]] && [[ $? -eq 0 ]]; then
echo "`tput setaf 2` node "$output" is up //Server2`tput setaf 7`"
else
echo "`tput setaf 1` node "$output" is down `tput setaf 7`"
fi
done
echo " Done pinging servers"
}
PING_SERVERS
echo ""
ping -c 2 -t 2 10.5.0.13 #just to show they are up while debuging
sleep 2
echo ""
ping -c 2 -t 2 10.5.0.30 #just to show they are up while debuging
sleep 5
exit
这是它在终端中给我的信息:
Pinging Servers...
node 10.5.0.13 is up //Server1
node 10.5.1.30 is down
Done pinging servers
PING 10.5.0.13 (10.5.0.13): 56 data bytes
64 bytes from 10.5.0.13: icmp_seq=0 ttl=64 time=1.731 ms
64 bytes from 10.5.0.13: icmp_seq=1 ttl=64 time=3.382 ms
--- 10.5.0.13 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.731/2.557/3.382/0.825 ms
PING 10.5.0.30 (10.5.0.30): 56 data bytes
64 bytes from 10.5.0.30: icmp_seq=0 ttl=64 time=2.151 ms
64 bytes from 10.5.0.30: icmp_seq=1 ttl=64 time=2.783 ms
--- 10.5.0.30 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.151/2.467/2.783/0.316 ms
感谢任何帮助。 杰森
@那个人 我猜我应该刷新一下,你是对的,我在尝试让它工作时搞砸了,谢谢。
在这里插入 facepalm,我明白了。事实证明这只是我盯着它看太久导致我看不到它的用户错误。
在重读我的原作 post 几次尝试解决更多问题后,我意识到 elif 检查的第二台主机与我在文件中尝试 ping 的主机不同。
第一台主机是 10.5.0.13 所以我假设我要检查的第二台主机是 10.5.0.30 并设置我的 elif 语句来检查它。然而事实证明(正如您在我 posted 的终端输出中看到的那样)它实际上是 10.5.1.30!
如果我没有 post 回答这个问题,我可能无法弄清楚,(尽管现在我再也不能在这里露面了)。感谢语法建议,我会稍微清理一下我的代码。
再次感谢, 杰森