一元运算符预期

我一直在试图找出什么是错误的,但只是无法弄清楚..

这部分似乎正在得到一个错误..

elif [ $operation = "man" ]; then if [ $aug1 = "add" ]; then # <- Line 75 echo "Man Page for: add" echo "" echo "Syntax: add [number 1] [number 2]" echo "" echo "Description:" echo "Add two different numbers together." echo "" echo "Info:" echo "Added in v1.0" echo "" elif [ -z $aug1 ]; then echo "Please specify a command to read the man page." else echo "There is no manual page for that command." fi 

我得到这个错误:

 calc_1.2: line 75: [: =: unary operator expected 

如果你知道你总是使用bash,总是使用双括号条件复合命令[[ ... ]]而不是Posix兼容的单括号版本[ ... ]更容易。 在[[ ... ]]化合物内部,单词拆分和path名扩展不适用于单词,因此您可以依靠

 if [[ $aug1 == "and" ]]; 

$aug1的值与stringand

如果你使用[ ... ] ,你总是需要记住双引号variables像这样:

 if [ "$aug1" = "and" ]; 

如果你不引用variables扩展,variables是不确定的或空的,它就会从犯罪现场消失,只剩下

 if [ = "and" ]; 

这不是一个有效的语法。 (如果$aug1包含空格或者元字符,它也会失败并显示不同的错误信息。)

现代[[运算符有很多其他很好的function,包括正则expression式匹配。

if[]语句中使用它之前,尝试给$aug1赋值; 之后的错误信息将消失。

花了我一会儿find这个,但请注意,如果你有一个间距错误,你也会得到同样的错误:

 [: =: unary operator expected 

正确:

 if [ "$APP_ENV" = "staging" ] 

VS

 if ["$APP_ENV" = "staging" ] 

像往常一样设置-xdebuggingvariables有助于find这些:

 set -x 

你也可以设置variables的默认值,所以你不需要使用两个“[”,这相当于两个进程(“[”实际上是一个程序),而不是一个。

它通过这个语法:$ {VARIABLE:-default}。

整个事情必须被认为是这种“默认”价值是有别于“有效”价值/内容的东西。

如果由于某种原因不可能的话,你可能需要添加一个步骤来检查是否有值,如“if [-z $ VARIABLE];然后echo”variables需要填充“,或者”如果[!-z $ VARIABLE];那么#一切都很好,继续脚本的其余部分“。