304

此脚本出现错误:

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

5 回答 5

660

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

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

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

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

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

如果不引用变量展开且变量未定义或为空,则从犯罪现场消失,只留下

if [ = "and" ];

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

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

于 2012-11-29T03:31:22.493 回答
44

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

[: =: unary operator expected

正确的:

if [ "$APP_ENV" = "staging" ]

对比

if ["$APP_ENV" = "staging" ]

与往常一样,设置-x调试变量有助于找到这些:

set -x
于 2017-09-21T20:43:40.823 回答
8

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

于 2015-09-25T12:27:22.370 回答
0

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

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

例如:

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

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

我必须在Arch Sign Modules的帮助脚本中解决这个unary operator expected问题。remove_old_pkgs()abk

另见6.4 Bash 条件表达式

于 2021-09-14T13:34:11.510 回答
-13

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

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

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

如果由于某种原因这不可能,您可能需要添加一个步骤,例如检查是否有值,沿着 "if [ -z $VARIABLE ] ; 然后回显 "需要填充变量"" 或 " if [ ! -z $VARIABLE ] ; 那么 #everything 没问题,继续脚本的其余部分”。

于 2014-05-01T08:11:33.913 回答