15

在我的 Bash 脚本中,我有一个函数为后面的函数的条件返回 0 或 1(真或假)。

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:需要一元运算符

我怎样才能解决这个问题?

4

1 回答 1

33

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

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

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

在您的main函数中,调用[似乎放错了地方。你大概是说

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

顺便说一句,为了更好地衡量,您还应该始终引用您的字符串。使用"$1"not $1,而"$arg"不是$arg

test作者不想将其作为通用厨房水槽的历史原因是其语法的一部分,这if是原始 Bourne shell 不太吸引人的设计之一。Bash 并zsh提供不太笨拙的替代方案(例如[[bash 中的双括号,您在function1定义中使用),当然,POSIXtest比贝尔实验室的原始创建要好得多。

作为附加说明,您的功能可以简化为

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

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

于 2012-05-14T15:20:59.483 回答