【问题标题】:Bash shell syntax error near unexpected token `(' [duplicate]意外标记'('附近的Bash shell语法错误[重复]
【发布时间】:2020-11-21 06:12:34
【问题描述】:

不知道为什么这个脚本在我的 CI 机器上总是出现语法错误。

if [ -d "$ws" ]; then
    if $condition; then
        echo "first condition"
    elif $second_condition; then
        ls -al
        shopt -s extglob
        rm -rf !(".repo")
        ls -al
        $[/myResource/ec.perl] $[/myResource/PWToolRootLocationFull]SetProperty.pl $[/myParent/parent.workflow.path]/builds/$[/myParent/variant.id]/is.repo.preserved "true"
    else
        echo "else"
    fi
fi

意外标记 `(' 附近的语法错误

我试过了

rm -rf !(.repo)
rm -rf "!(.repo)"
rm -rf !\(.repo\)
rm -rf !"(.repo)"

它们都不起作用。

【问题讨论】:

  • 只有在shopt -s extglob 缺失时才会出现错误。
  • @choroba 你用过 bash shell 吗?
  • 这就是使用sh 而不是bash 调用脚本时会遇到的错误,但随后您可能首先会收到“shopt: not found”错误。 $[...] 语法看起来很奇怪:这是 bash 不推荐使用的算术扩展语法——它在你的 CI 管道中是否有某种特殊含义?
  • 如果您使用shopt -s extglob,那么rm -rf -- !(*.repo) 将删除当前目录中不以.repo 结尾的所有内容。
  • @glennjackman 嗯,这个 CI 管道真的很老了(超过 10 年)。如果它包含过时的内容,我不会感到奇怪。我没有收到“shopt:未找到”错误。

标签: bash shell


【解决方案1】:

shell 必须解析整个外部if 语句(及其所有内容)才能执行它,这意味着它必须在执行shopt -s extglob 之前解析该模式。解决方案:将shopt -s extglob 移动到脚本的最开头(或至少在第一个if 之前)。

【讨论】:

  • 顺便说一句,这个问题与"Case statement with extglob" 中的问题几乎重复,除了在这种情况下,它是一个函数定义,而不是导致预解析的封闭if 块。我不确定它是否应该被标记为欺骗。
猜你喜欢
  • 2018-02-16
  • 2014-02-26
  • 2018-12-18
  • 2014-01-20
  • 2015-12-11
  • 2021-07-29
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多