将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
额外优化说明
- 变量添加双引号:避免变量为空或包含空格时出现语法错误,符合POSIX规范
- 替换
&> /dev/null为> /dev/null 2>&1:这是POSIX标准的重定向写法,&>是Bash扩展 - 也可以直接将
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
相关产品推荐
相关产品推荐

