测试文件
COMMAND1="Build `date`"
COMMAND2="echo $PATH"
echo "Command1 is: $COMMAND1"
echo "Command2 is: $COMMAND2"
Run Code Online (Sandbox Code Playgroud)
输出
Command1 is: Build Wed Dec 26 21:09:43 UTC 2018
Command2 is: echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
在上面的 shell 脚本中,如何在不评估表达式的情况下进行回显,即我想要的Command1 is: Build `date`
我知道我可以转义`和$字符,但在我的应用程序中,它们来自上游服务并作为参数传递给 shell 脚本。即使上游服务也无法逃脱它们,因为稍后在脚本中我实际上需要执行这些命令。
理想的方法是告诉 echo 仅扩展变量$COMMAND1,但不评估其中的任何内容。或者使用sed来转义所有出现的`and $,但我也未能实现。
表达式在赋值时求值。
COMMAND1="Build `date`"
Run Code Online (Sandbox Code Playgroud)
这`...`是一个命令替换,已被弃用以支持$( ... )样式。双"引号用于允许文本展开。所以首先这个命令被扩展为:
COMMAND1='Build Wed Dec 26 21:09:43 UTC 2018'
Run Code Online (Sandbox Code Playgroud)
然后分配发生。您稍后无法检索使用什么命令来声明该变量。该信息丢失了。如果您有一些上游 - 它需要将此信息传递给您。
如果您希望COMMAND1包含字符串(字面意思)
Build `date`
Run Code Online (Sandbox Code Playgroud)
您可以使用单引号:
COMMAND1='Build `date`'
Run Code Online (Sandbox Code Playgroud)
您稍后可以使用某种组合eval或类似的组合来扩展变量,但是我建议只执行一个函数
COMMAND1() {
Build $(date)
}
echo "COMMAND1 is declared as:"
declare -f COMMAND1
echo "COMMAND1 execution returns: $(COMMAND1)"
Run Code Online (Sandbox Code Playgroud)
有用的网址: