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

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循环,因此没有任何输出。

解决办法

  1. 给ping添加-c参数指定发送包的数量(比如-c 1),让它只发送1个包就终止,这样能快速获取ping值,避免脚本卡住。
  2. 将获取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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:25:22