Bash 脚本错误:意外标记“(”附近出现语法错误

Bash 脚本错误:意外标记“(”附近出现语法错误

我想多次运行一个命令,但传递给它不同的参数,所以我编写了以下 shell 脚本来执行此操作

#!/bin/bash                                                                                                                                                                                                   
for i in {4..6}
do
    for j in {0..10}
    do
        for k in {0..2}
        do
            root -b -l -q fitInvMass.C+($i,$j,$k)
        done
    done
done

但是,这会出现以下错误

fit.sh: line 8: syntax error near unexpected token `('
fit.sh: line 8: `       root -b -l -q fitInvMass.C+($i,$j,$k)'

答案1

括号是 shell 语法中的特殊字符,用于各种运算符和结构,例如函数定义、命令和进程替换、数组赋值、算术表达式、子 shell 等。如果需要使用文字括号,则应引用它们:

root -b -l -q "fitInvMass.C+($i,$j,$k)"

使用双引号可确保展开字符串中的变量,fitInvMass.C+($i,$j,$k)同时括号不会被解释为 shell 代码。


一般建议是使用 ShellCheck (https://www.shellcheck.net) 来测试 shell 代码。它非常擅长指出诸如缺少引号等问题。

不过,在这种情况下,ShellCheck 会正确指出 中 的三个变量扩展fitInvMass.C+($i,$j,$k)应该被引用,但它无法发现括号也需要引用。这意味着它会很乐意接受以下修改后的行:

root -b -l -q fitInvMass.C+("$i","$j","$k")

(或其变体,其中变量被引用但括号未被引用。)

但是,这仍然无法运行,并显示相同的诊断错误消息。为什么 ShellCheck 不抱怨呢?

是一种扩展的通配模式,它是shell 扩展通配语法+(...)的有效部分。bash不幸的是,ShellCheck 似乎忽略了extglob需要启用 shell 选项才能使模式有效并无论如何接受它。这可以说是 ShellCheck 中的一个错误。

相关内容