我想多次运行一个命令,但传递给它不同的参数,所以我编写了以下 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 中的一个错误。