如果满足条件,Bash中将出现“一元运算符预期”错误


225

我一直在试图找出问题出在哪里,但是却无法解决。

这部分似乎出现了错误。

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

4
我认为您if在第75行的声明需要一个fi
史蒂夫

7
如有疑问,请引用vars。
koola 2012年

9
@koola,“总是”引用vars。
CousinCocaine 2014年

Answers:


480

如果您知道将始终使用bash,则始终使用双括号条件复合命令要容易得多[[ ... ]],而不是Posix兼容的单括号版本[ ... ]。在[[ ... ]]复合词内部,单词拆分和路径名扩展不适用于单词,因此您可以依靠

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

比较$aug1字符串的值and

如果使用[ ... ],则始终需要记住将变量加双引号,如下所示:

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

如果您不引用变量扩展且变量未定义或为空,则它将从犯罪现场消失,仅留下

if [ = "and" ]; 

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

现代[[运算符还有许多其他不错的功能,包括正则表达式匹配。


9
“现代”?难道[[ 一直都在狂欢吗?它已经在Korn shell中使用了20多年,并且早于bash。(不过我知道您的意思)
cdarke

31

花了我一段时间才能找到这个,但请注意,如果您遇到间距错误,也会遇到相同的错误:

[: =: unary operator expected

正确:

if [ "$APP_ENV" = "staging" ]

if ["$APP_ENV" = "staging" ]

与往常一样,设置-x调试变量有助于查找以下内容:

set -x

有人在构建脚本中将这个错误遗赠给了我。节省了我一些时间,谢谢!
凯尔(Kyle)'18年

8

$aug1if[]语句中使用值之前,请尝试为其分配一个值;错误消息随后将消失。


0

你说 ... :

elif [$ operation =“ man”]; 则如果[$ aug1 =“ add”]; 然后#<-75行echo“ Man Page for:add” echo“” echo“语法:add [数字1] [数字2]” echo“”回声“描述:” echo“将两个不同的数字加在一起。” echo“” echo“ Info:” echo“在v1.0中添加” echo“” elif [-z $ aug1]; 然后回显“请指定命令以阅读手册页。” 否则,回显“该命令没有手册页。” 科幻

我认为这只是空间...这样做:

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

-11

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

它采用以下语法:$ {VARIABLE:-default}。

整个事物必须以这种方式来考虑,即该“默认”值与“有效”值/内容有所不同。

如果由于某种原因无法实现,则可能需要添加诸如检查所有值是否存在的步骤,如“ if [-z $ VARIABLE];然后回显“该变量需要填充”。如果[!-z $ VARIABLE];那么#一切都很好,请继续执行脚本的其余部分。


3
[[没有产生两个进程,它是一个内置的shell([也是一个Bash内置的)。[[与不同[ [,后者将第二个[视为字符串
user123444555621 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.