2016-02-09 63 views
0

所以我在写一个bash shell脚本,我的前几行看起来是这样的:[:缺少`]在bash脚本”

if ! [ $# -eq 0 || $# -eq 1 ]; then 
    echo -e "Usage: myScriptName [\e[3mdir\e[0m] [\e[3m-f file\e[0m]" 
    exit 1 
fi 

但是当我运行它,它说:“[:失踪`]'”。我没有看到失踪],除了;感动],所以我错过了什么?

+2

[ShellCheck](http://www.shellcheck.net/)可能会有所帮助。 – kojiro

+1

由于'||'分隔了两个命令,'['接收'$#','-eq'和'0'作为参数的值。为了保持语法的错觉,'[''需要一个“匹配”'''作为它的最终参数。 – chepner

回答

7

在单支撑测试表达式中不能使用像||这样的运算符。您必须做

! [[ $# -eq 0 || $# -eq 1 ]] 

! { [ $# -eq 0 ] || [ $# -eq 1 ]; } 

! [ $# -eq 0 -o $# -eq 1 ] 

的双支柱关键字是一个bash的表达,并不会与其他POSIX壳工作,但它有一些好处,比如能够更容易地完成这些操作。

当然,有很多方法来测试传递参数的数量。 $2的存在也会回答你的问题。