为何我的Bash脚本执行时提示‘[2: command not found’错误?
Bash脚本参数判断出错问题排查
问题重现
用户编写的Bash脚本如下:
#!/bin/sh echo "arg 0=" $0 echo "arg 1=" $1 echo "arg 2=" $2 if [$# -eq 1]; then cal $1 elif [$# -eq 2]; then cal $1 $2 else echo Incorrect amount of arguments used fi
执行命令 ./calscript.sh 5 2020 后,得到错误输出:
arg 0= calscript.sh arg 1= 5 arg 2= 2020 calscript.sh: line 6: [2: not found calscript.sh: line 8: [2: not found Incorrect amount of arguments used
预期显示2020年5月的日历,但脚本执行失败。
错误原因
问题出在条件判断的语法上:[ 是一个独立的Shell命令(等价于test命令),它和后面的表达式之间必须有空格分隔。
用户写的[$# -eq 1]会被Shell解析成一个整体的命令名:当传入2个参数时,$#的值是2,这行代码会变成[2 -eq 1],Shell会尝试寻找名为[2的命令,自然找不到,因此报错。
修正后的脚本
在[后面、]前面添加空格即可解决问题:
#!/bin/sh echo "arg 0=" $0 echo "arg 1=" $1 echo "arg 2=" $2 if [ $# -eq 1 ]; then cal $1 elif [ $# -eq 2 ]; then cal $1 $2 else echo Incorrect amount of arguments used fi
执行修正后的脚本,输入./calscript.sh 5 2020就能正确显示2020年5月的日历了。
内容的提问来源于stack exchange,提问作者Javier Moni
相关产品推荐
相关产品推荐

