如何在Bash脚本中正确获取Ping命令执行结果(避免依赖$?变量)
问题分析与解决办法
嘿,我来帮你理清这个问题~
首先得搞明白你第二种写法失效的原因:$(ping -q -c2 10.10.50.120 > /dev/null)这个语法是捕获命令的标准输出内容,但你已经把ping的所有输出重定向到/dev/null了,所以变量resp其实是空字符串。空字符串和0比较自然不相等,脚本也就走到了else分支输出not ok。
而你不想用$?的话,其实有更简洁规范的写法,甚至不需要额外变量来存退出状态:
最推荐的写法:直接在if中执行命令
Bash的if语句本身就会检查命令的退出状态(0代表成功,非0代表失败),所以可以直接把ping命令写在if后面:
#!/bin/bash if ping -q -c2 10.10.50.120 > /dev/null; then echo "ok" else echo "not ok" fi
这样既避开了$?,代码也更简洁易读。
如果确实需要保存退出状态
要是你一定要把状态存在变量里,也可以用逻辑运算符实现,完全不用$?:
#!/bin/bash # 命令成功则resp设为0,失败设为1 ping -q -c2 10.10.50.120 > /dev/null && resp=0 || resp=1 echo "$resp" if [ "$resp" -eq 0 ]; then echo "ok" else echo "not ok" fi
这里注意用-eq做数值比较,比==更符合Bash中数值判断的规范。
内容的提问来源于stack exchange,提问作者David Stegmüller
相关产品推荐
相关产品推荐

