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

GJ.*_*GJ. 12 bash if-statement unary-operator

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

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

然后在我的主要功能:

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

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

有人可以帮我吗?

tri*_*eee 29

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

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi
Run Code Online (Sandbox Code Playgroud)

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

在您的main函数中,调用[显示放错位置.你可能意味着

if function "$arg"; then
    ...
elif ... ; then ...
Run Code Online (Sandbox Code Playgroud)

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

test作为一般厨房水槽的历史原因,作者不想成为语法的一部分,if是原始Bourne shell的一个不太吸引人的设计.Bash并zsh提供不那么笨重的替代品(比如[[你在function1定义中使用的bash中的双括号),当然,POSIX test比贝尔实验室的原始创作更加温和.

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

function1 () {
    ! [[ "$1" =~ "^ ...some regexp... $" ]]
}
Run Code Online (Sandbox Code Playgroud)

也就是说,执行测试[[并反转其结果代码.("正常"情况是返回0表示成功,但是您可能正在尝试验证字符串是否不匹配?)