在bash脚本中遇到“一元运算符期望”

时间:2012-05-14 15:18:46

标签: bash if-statement unary-operator

在我的bash脚本中,我有一个函数为后面的main函数的条件返回0或1(true或false)。

function1 () { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then
        return 1
    else
        return 0
    fi 
}

然后在我的主要功能中:

main () { 
    for arg in ${@} ; do
        if [ function1 ${arg} ] ; then
            ...
        elif [ ... ] ; then
            ...
        fi
    done
}

然而,当我运行这个脚本时,它总是给我一个错误信息“[:function1:一元运算符预期”

有人可以帮我吗?

1 个答案:

答案 0 :(得分:29)

您犯了一个常见错误,即假设[if命令语法的一部分。它不是; if的语法只是

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi

我们使用的常见command之一是[,它是命令test的别名。这是一个比较字符串,数字和文件的简单命令。它接受一个相当狭窄的参数组合,如果你没有传递预期的参数,往往会产生令人困惑和误导性的错误消息。 (或者更确切地说,一旦你习惯了它,错误信息就足够了,但如果不使用它们很容易被误解。)

main功能中,对[的调用似乎放错地方了。你可能意味着

if function "$arg"; then
    ...
elif ... ; then ...

顺便说一下,为了更好的衡量,你也应该总是引用你的字符串。使用"$1"而非$1"$arg"代替$arg

test作为一般厨房的历史原因,作者不想参与if的语法,这是原始Bourne shell的一个不太吸引人的设计。 Bash和zsh提供的选项不那么笨重(比如你在[[定义中使用的bash中的function1双括号),当然,POSIX test是比贝尔实验室最初的创作更加温和。

作为补充说明,您的功能可以简化为

function1 () {
    ! [[ "$1" =~ "^ ...some regexp... $" ]]
}

即,使用[[执行测试并反转其结果代码。 (“正常”情况是返回0表示成功,但是您可能正在尝试验证字符串不匹配?)