对于 bash 脚本,是否有类似于 C/C++ 中的#define 的内容?

Is there something similar to #define in C/C++ for a bash script?

我目前正在编写一个调用几个程序的脚本,例如:

root -l -q Analysis.C+'("var1", "var2", "var3")'

我现在想要一个 bash 脚本,它可以自动将用户输入替换为 var1、var2、var3 等。但是,如果我编写类似

的内容
root -l -q Analysis.C+'("", "", "")'

这似乎不起作用,因为它将 $1 等解释为字符串而不是变量。是否有类似于 C/C++ 中的#define 的东西,其中变量在 运行 之前的整个脚本中被替换?或者如何做到这一点?

不,无论引用上下文如何,您都不能执行预处理。这是因为 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");