这个脚本得到一个错误:

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兼容的单括号版本[…]]. 在一个[[…]]复合,分词和路径名展开不应用于单词,因此您可以依赖

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

将$aug1的值与字符串和进行比较。

如果你用[…],你总是需要记住双引号变量,像这样:

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

如果你不引用变量展开,变量没有定义或为空,它就会从犯罪现场消失,只留下

if [ = "and" ];

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

现代的[[操作符有许多其他不错的特性,包括正则表达式匹配。


您还可以为变量设置一个默认值,这样就不需要使用两个“[”,这相当于两个进程(“[”实际上是一个程序),而不是一个。

它遵循这样的语法:${VARIABLE:-default}。

整个事情必须以这样一种方式思考,即这个“默认”值与“有效”值/内容是不同的。

如果由于某些原因这是不可能的,你可能需要添加一个步骤,如检查是否有一个值,沿着“If [-z $VARIABLE];然后返回“变量需要填充”或“if[!”-z $VARIABLE];然后#一切正常,继续脚本的其余部分”。


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


我花了一段时间才找到这个,但请注意,如果你有一个空格错误,你也会得到相同的错误:

[: =: unary operator expected

正确的:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

和往常一样,设置-x debug变量有助于找到这些:

set -x

读取可能为空白的数值输入(接受默认选项)时也会发生此错误。

解决方案是用多个条件构造if语句,并首先测试空变量。

例如:

# sanitise input
var=$(echo $ans | tr -cd "[:digit:]")

if [ -z "$var" ] || [ "$var" -lt 1 ]; then
   do_something
fi

我必须解决这个一元操作符预期的问题,在帮助脚本abk的拱门符号模块remove_old_pkgs()。

请参见6.4 Bash条件表达式


确保在使用字符串比较$operation这样的变量时,如果使用POSIX方法(单括号),不会留下$operation返回空字符串的可能性。

[$operation == "man"]和["" " == "man"]都返回相同的错误: [: ==:一元运算符

此外,你不应该使用=运算符,除非你有双括号,如上所述。

参考: https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html