遭遇;应为一元运算符“;在bash脚本中

遭遇;应为一元运算符“;在bash脚本中,bash,if-statement,unary-operator,Bash,If Statement,Unary Operator,在我的bash脚本中,我有一个函数返回0或1(true或false)作为后面主函数的条件 function1 () { if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then return 1 else return 0 fi } 然后在我的主要功能中: main () { for arg in ${@} ; do if [ function1 ${arg} ] ;

在我的bash脚本中,我有一个函数返回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:unary operator expected”


有人能帮我吗?

你犯了一个常见的错误,认为
[
if
命令语法的一部分。事实并非如此;
if
的语法很简单

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi
我们常用的
命令之一是
[
这是命令
test
的别名。它是一个比较字符串、数字和文件的简单命令。它接受相当窄的参数组合,如果不传递预期的参数,往往会生成令人困惑和误导的错误消息。(或者更确切地说,一旦您习惯了错误消息,它就足够了,而且非常有用,但如果您不习惯,它们很容易被误解。)

在您的
main
函数中,对
[
的调用似乎放错了位置。您的意思可能是

if function "$arg"; then
    ...
elif ... ; then ...
顺便说一句,为了更好地衡量,您还应该始终引用字符串。使用
“$1”
而不是
$1
,使用
“$arg”
而不是
$arg

test
作为一般厨房洗涤槽的历史原因作者不想成为
语法的一部分,如果
是原始Bourne shell的一个不太吸引人的设计。Bash和
zsh
提供了不太笨重的替代品(如
[[
bash中的双括号,您在
函数1
定义中使用了它),当然,POSIX
测试
比贝尔实验室最初的创建要温和得多

作为补充说明,您的函数可以简化为

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

也就是说,使用
[[
执行测试并反转其结果代码。(正常情况下,如果成功,则返回0,但可能您正在尝试验证字符串是否匹配?

这些…表示${1}之后的脚本,在我的实际脚本中,我小心地将脚本和方括号分割成一个空格。因此我认为这不是问题所在。不,我的函数1实际上检查$1是否与某种正则表达式匹配。我的函数1单独运行时效果很好。所以我认为我的主函数中的条件存在一些问题onOh,抱歉,错过了
main
中的错误。感谢您的提示。基本分析仍然有效;
[
不是你想象的那样。谢谢!我不应该在我的main条件中使用括号。谢谢!我重新调整了这个答案的用途,这是一个更为集中的问题。如果你链接到这里,也许可以点击更新的问题。请注意,至少在bash版本4中,你不应该引用正则表达式:这样做会强制简单字符串匹配--。另外,你应该在“$@”
中为arg使用
,或者更简单的
为arg;do…
你应该把你的正则表达式放在一个变量中。
pattern='^…一些regexp…$”;如果[[$1=~$pattern]]
。请注意,在双方括号内,没有必要引用变量,正如glenn所说的,正则表达式(变量)不应被引用。