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

Linux下批量ping IP列表,如何按返回值与stderr分存至不同文件?

批量Ping IP并分类存储结果

我有一个存储IP地址的ip_list.txt文件,内容如下:

162.243.217.39
170.175.178.13
235.169.86.84
218.820.241.164
104.89.61.87
254.217.220.124

需求很明确:给这些IP挨个执行ping操作,把返回值是0或1的结果存到correct.txt,把出现错误码2的结果存到error.txt。我自己写了段脚本,但语法不对,跑不起来:

while IFS= read -r ip; do
    if ping -c4 $ip == 0 ||ping -c4 $ip == 1
    then >> correct.txt
    else >> error.txt
done < ip_list.txt

能正常运行的修正版脚本

while IFS= read -r ip; do
    # 执行ping,把输出都丢掉,只留退出码
    ping -c4 "$ip" > /dev/null 2>&1
    exit_code=$?

    # 根据退出码分类存储
    case $exit_code in
        0|1)
            echo "$ip - 状态正常,退出码: $exit_code" >> correct.txt
            ;;
        2)
            echo "$ip - 执行出错,退出码: $exit_code" >> error.txt
            ;;
        *)
            # 其他少见的退出码,统一归到正常文件里,也可以单独存
            echo "$ip - 未知状态,退出码: $exit_code" >> correct.txt
            ;;
    esac
done < ip_list.txt

原脚本的问题和修正说明

  1. 错误的退出码判断方式:原脚本里ping -c4 $ip == 0是完全错误的语法,bash里要拿命令的退出码,得先执行命令,再用$?获取结果,或者直接用if ping ...; then判断(这种方式默认判断退出码是否为0)。
  2. 没有写入内容:原脚本里>> correct.txt只是打开文件,但没写任何内容,等于白忙活,这里改成把IP和状态信息写进去,方便后续核对。
  3. 变量没加引号:$ip改成"$ip",避免万一IP里有特殊字符(虽然这里没有,但养成好习惯能避免很多坑)。
  4. ping的输出干扰:加了> /dev/null 2>&1把ping的正常输出和错误输出都屏蔽掉,不然终端会一堆信息,我们只关心退出码就行。
  5. 退出码含义:
    • 0:ping成功,收到对方回复
    • 1:ping发了包但没收到回复(比如IP存在但禁ping)
    • 2:命令执行失败(比如IP格式无效、无法解析、没权限)

内容的提问来源于stack exchange,提问作者niico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:40:37