一元运算符预期
我一直在试图找出什么是错误的,但只是无法弄清楚..
这部分似乎正在得到一个错误..
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" ]
像往常一样设置-x
debuggingvariables有助于find这些:
set -x
你也可以设置variables的默认值,所以你不需要使用两个“[”,这相当于两个进程(“[”实际上是一个程序),而不是一个。
它通过这个语法:$ {VARIABLE:-default}。
整个事情必须被认为是这种“默认”价值是有别于“有效”价值/内容的东西。
如果由于某种原因不可能的话,你可能需要添加一个步骤来检查是否有值,如“if [-z $ VARIABLE];然后echo”variables需要填充“,或者”如果[!-z $ VARIABLE];那么#一切都很好,继续脚本的其余部分“。