一元运营商的预期

时间:2012-11-29 02:22:47

标签: bash shell

我一直试图弄清楚这有什么不对,但是无法理解......

这部分似乎是一个错误..

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 个答案:

答案 0 :(得分:373)

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

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

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

如果你使用[ ... ],你总是需要记住双重引用这样的变量:

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

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

if [ = "and" ]; 

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

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

答案 1 :(得分:18)

我花了一些时间才发现这一点,但请注意,如果你有间距错误,你也会得到同样的错误:

[: =: unary operator expected

正确:

if [ "$APP_ENV" = "staging" ]

VS

if ["$APP_ENV" = "staging" ]

始终设置-x调试变量有助于找到这些:

set -x

答案 2 :(得分:7)

$aug1语句中使用之前,请尝试为if[]分配值;错误信息将在之后消失。

答案 3 :(得分:-10)

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

它遵循以下语法:$ {VARIABLE:-default}。

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

如果由于某种原因这是不可能的,你可能需要添加一个步骤,比如检查是否有一个值,沿着“if [-z $ VARIABLE];然后回显”变量需要填充“” ,或“如果[!-z $ VARIABLE];然后#everything就好了,继续执行脚本的其余部分”。