一元运算符预期一元运算符预期(unary operator expected)

2019-05-12 15:46发布

我一直试图弄清楚什么是错与此,但只是不出来..

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

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

Answer 1:

如果你知道你总是要使用bash,它更容易为始终使用双支架有条件的复合命令[[ ... ]]而不是符合POSIX标准的单支架版本[ ... ] 内部[[ ... ]]复合,字的拆分和路径扩展不会应用到的话,那么你可以依靠

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

到的值进行比较$aug1与串and

如果您使用[ ... ]你总是需要记住翻一番这样的引用变量:

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

如果不引用变量扩展和变量未定义或空的,它从犯罪现场消失,只留下

if [ = "and" ]; 

这不是一个有效的语法。 (这也将失败,如果一个不同的错误信息$aug1包含空格或shell转义字符。)

现代[[经营者有很多其他不错的功能,包括正则表达式匹配。



Answer 2:

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

[: =: unary operator expected

正确:

if [ "$APP_ENV" = "staging" ]

VS

if ["$APP_ENV" = "staging" ]

与往常一样设定-x调试变量帮助找到这些:

set -x


Answer 3:

尝试将值分配给$aug1在使用之前, if[]报表; 该错误消息后会消失。



Answer 4:

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

它的推移,这种语法:$ {变量:-default}。

整个事情必须以这样的方式来认为,这种“默认”值是不同的东西从一个“有效”的价值/内容。

如果这是不可能因为某些原因,你可能需要添加像检查,如果有一个价值可言,沿行一步,“如果[-z $变量;然后回声‘的变量需要填写’”,或者“如果[-z $变量!],然后#everything是好的,继续执行脚本”的其余部分。



文章来源: unary operator expected
标签: bash shell