我目前正在编写一个调用一些程序的脚本,例如:
root -l -q Analysis.C+'("var1", "var2", "var3")'
我现在想要一个bash脚本,它会自动用var1,var2,var3等替换用户输入。但是,如果我写了类似
的内容root -l -q Analysis.C+'("$1", "$2", "$3")'
这似乎不起作用,因为它解释了$ 1,因此它是字符串而不是变量。在C / C ++中有类似于#define的东西,在运行之前,变量在整个脚本中被替换了吗?或者如何做到这一点?
答案 0 :(得分:2)
不,无论引用上下文如何,都无法执行预处理。这是因为在shell中引用上下文的非常重要是控制哪种替换发生和不发生。如果您可以定义单引号中发生的替换,那么单引号在shell中的含义(其中的字符被视为文字而不受扩展)将会丢失。
这样做会看起来像:
root -l -q Analysis.C+'("'"$var1"'", "'"$var2"'", "'"$var3"'");'
也就是说:单引号上下文结束,并在每次参数替换之前启动双引号上下文。
这可以在下面看到:
$ var1=a; var2=b; var3=c
$ printf '%s\n' root -l -q Analysis.C+'("'"$var1"'", "'"$var2"'", "'"$var3"'");'
root
-l
-q
Analysis.C+("a", "b", "c");