KSH循环脚本无输出问题求助:for/while循环均无法正常执行
KSH脚本循环无输出问题排查与解决
要实现一个KSH脚本重复执行if判断逻辑5次,但运行后无任何输出,必须按^C终止进程。单独执行if逻辑正常,改用while循环也出现相同问题,通过ps确认脚本处于运行状态但无输出。原脚本如下:
#! /bin/ksh currentping=$( ping 8.8.8.8 | sed '/^PING/d;/^$/d;/^-/d;/transmitted/d;/^rtt/d' | awk '{print $7}' | awk '{print substr( $0, length () -3) }' | sed 's/\=//' ) for i in {1..5}; do if [[ $currentping -lt 100 ]]; then echo "Your ping is $currentping." elif [[ $currentping -ge 100 ]]; then echo "Your current ping, which is $currentping, sucks. Go find better internet!" else echo "Your connection sucks!" fi; echo $i done
问题原因
核心问题出在ping命令的默认行为:默认情况下ping会持续发送ICMP包,不会自动终止,导致currentping=$(...)这行代码一直等待ping结束,永远无法进入后续的for循环,因此没有任何输出。
解决办法
- 给
ping添加-c参数指定发送包的数量(比如-c 1),让它只发送1个包就终止,这样能快速获取ping值,避免脚本卡住。 - 将获取
currentping的命令放到for循环内部,确保每次循环都能获取最新的ping值(原脚本仅在启动时获取一次ping值,循环内复用同一个值)。
修改后的脚本
#! /bin/ksh for i in {1..5}; do # 每次循环重新获取ping值,-c 1指定只发送1个包 currentping=$( ping -c 1 8.8.8.8 | sed '/^PING/d;/^$/d;/^-/d;/transmitted/d;/^rtt/d' | awk '{print $7}' | awk '{print substr( $0, length () -3) }' | sed 's/\=//' ) # 处理ping失败的情况(currentping为空) if [[ -z "$currentping" ]]; then echo "Your connection sucks!" elif [[ $currentping -lt 100 ]]; then echo "Your ping is $currentping." else echo "Your current ping, which is $currentping, sucks. Go find better internet!" fi echo "Loop iteration: $i" # 可选:每次循环间隔1秒,避免频繁发包 sleep 1 done
额外优化说明
- 增加了ping失败的判断逻辑(当
currentping为空时),避免脚本因数值比较报错。 - 添加
sleep 1让循环间隔1秒,更符合实际网络测试场景。
内容的提问来源于stack exchange,提问作者Jesse C.
相关产品推荐
相关产品推荐

