"unary operator expected" Bash if 条件中的错误



此脚本出现错误:

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 的值与字符串 and 进行比较。

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

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

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

if [ = "and" ];

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

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

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

[: =: unary operator expected

正确:

if [ "$APP_ENV" = "staging" ]

if ["$APP_ENV" = "staging" ]

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

set -x

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

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

[ $operation == "man"]

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

此外,如上所述,除非

双括号,否则不应使用 = 运算符。

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

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

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

例如:

# sanitise input
var=$(echo $ans | tr -cd "[:digit:]")
if [ -z "$var" ] || [ "$var" -lt 1 ]; then
   do_something
fi

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

另请参阅 6.4 Bash 条件表达式

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

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

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

如果由于某种原因无法做到这一点,您可能需要添加一个步骤,例如检查是否有值,如"if [ -z $VARIABLE ] ;然后回显"变量需要填充"或"if [ !-z $VARIABLE ] ;然后 #everything 很好,继续脚本的其余部分"。

相关内容

  • 没有找到相关文章

最新更新