You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:19:06