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

