【问题标题】:I encountered "unary operator expected" in a Bash script我在 Bash 脚本中遇到了“预期的一元运算符”
【发布时间】:2012-05-14 15:18:45
【问题描述】:

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

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

然后在我的main函数中:

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

但是,当我运行此脚本时,它总是给我一条错误消息:

[: function1: 需要一元运算符

我该如何解决这个问题?

【问题讨论】:

  • 请注意,至少在 bash 版本 4 中,您不应引用正则表达式:这样做会强制进行简单的字符串匹配 -- documented here。此外,您应该使用带引号的for arg in "$@",或更简单的for arg; do ...
  • 你应该把你的正则表达式放在一个变量中。 pattern='^ ...some regexp... $'; if [[ $1 =~ $pattern ]]。请注意,在双方括号内,没有必要引用变量,正如 glenn 所说,永远不应该引用正则表达式(变量)。

标签: bash if-statement unary-operator


【解决方案1】:

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

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

我们使用的常见commands 之一是[,它是命令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 表示成功,但也许您正试图验证字符串不匹配?)

【讨论】:

  • 那些 ... 代表 ${1} 之后的脚本,在我的实际脚本中,我小心地将脚本和括号用一个空格分开。所以我认为这不是问题
  • 不,我的函数 1 实际上检查 $1 是否匹配某种正则表达式。我的功能 1 单独工作也很好。所以我认为我的主要功能中的条件存在一些问题
  • 哦,抱歉,错过了main 中的错误。感谢您的提示。基本分析仍然成立; [ 不是你想的那样。
  • 谢谢!我不应该在我的主要条件中使用括号。谢谢!
  • 我在stackoverflow.com/a/36371520/874188 重新使用了这个答案,这是一个更集中的问题。如果您已链接到此处,或许可以点击进入较新的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多