提取Bash脚本单个参数时遇[run: command not found错误求助
问题排查与解决
这问题我太熟了!你碰到的[run: command not found错误,完全是bash里test命令(也就是方括号[)的语法细节没注意到导致的,咱们一步步理清楚:
错误根源
bash里的[是一个内置命令(和test是同一个东西),它的语法要求非常严格:
[后面必须跟一个空格,不能直接和变量/字符串连在一起- 结尾的
]前面也必须跟一个空格,它是[命令的结束标记,得单独作为参数
你写的[$1 == 'run'],bash会把[$1当成一个完整的命令名——当你传入run作为参数时,就变成了[run,系统自然找不到这个命令,所以才会报[run: command not found。
修正后的代码
把语法细节调整好,再补充一些健壮性处理,最终代码应该是这样的:
function main () { if [ "$1" == 'run' ]; then echo "turning intercept proxies on"; # enableInterceptProxies; echo "intercept proxies turned on"; elif [ "$1" == 'term' ]; then echo "turning intercept proxies off"; # disabbleInterceptProxies; echo "intercept proxies turned off"; else echo "Invalid argument! Usage: ./intercept.sh run|term" fi } # 别忘了调用main函数,把脚本接收的参数传进去 main "$@"
额外优化点
- 给
$1套上双引号:如果用户没传任何参数,$1为空,不加引号会导致[ == 'run' ]这种非法语法,加双引号能避免这种情况。 - 增加
else分支:处理用户传错参数的情况,友好提示正确用法。 - 也可以用
[[ ]](bash的扩展test语法),它的语法更宽松,不需要严格的空格(不过还是建议保持良好习惯),比如[[ $1 == 'run' ]]也能正常工作,但[是POSIX标准的,兼容性更好。
内容的提问来源于stack exchange,提问作者SomeWhatCertified
相关产品推荐
相关产品推荐

