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

将BASH脚本转换为SH脚本时遇[[命令未找到错误求助

问题:Bash脚本转Sh脚本后执行报错[[: not found]]

原Bash脚本:

#!/bin/bash
upper_limit=1500
lower_limit=1
middle=750
while [[ $lower_limit != $middle ]]
do
ping -M do -s $middle -c 1 8.8.8.8 &> /dev/null
if [ $? == "0" ]
then
lower_limit=$middle
else
upper_limit=$middle
fi
middle=$(( ($upper_limit + $lower_limit) / 2 ))
done
echo $middle

将开头改为#!/bin/sh后执行,出现错误:

./test.sh: 6: [[: not found

原因分析

[[ ]]是Bash专属的扩展条件判断语法,而/bin/sh通常指向POSIX标准兼容的Shell(比如Debian/Ubuntu下的dash),这类Shell不支持[[ ]]这种非标准语法,因此会触发[[: not found]]错误。另外,==在POSIX标准的[ ]中属于非扩展用法,建议改用标准的=。

修复后的Sh脚本

将Bash特有的语法替换为POSIX兼容写法:

#!/bin/sh
upper_limit=1500
lower_limit=1
middle=750
while [ "$lower_limit" != "$middle" ]
do
ping -M do -s "$middle" -c 1 8.8.8.8 > /dev/null 2>&1
if [ "$?" = "0" ]
then
lower_limit=$middle
else
upper_limit=$middle
fi
middle=$(( ($upper_limit + $lower_limit) / 2 ))
done
echo $middle

额外优化说明

  1. 变量添加双引号:避免变量为空或包含空格时出现语法错误,符合POSIX规范
  2. 替换&> /dev/null为> /dev/null 2>&1:这是POSIX标准的重定向写法,&>是Bash扩展
  3. 也可以直接将if [ "$?" = "0" ]简化为if ping ...; then,让代码更简洁:
#!/bin/sh
upper_limit=1500
lower_limit=1
middle=750
while [ "$lower_limit" != "$middle" ]
do
if ping -M do -s "$middle" -c 1 8.8.8.8 > /dev/null 2>&1
then
lower_limit=$middle
else
upper_limit=$middle
fi
middle=$(( ($upper_limit + $lower_limit) / 2 ))
done
echo $middle

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:45:56