bash echo 带有转义反引号和 $

Ras*_*ash 2 shell sed sh echo

测试文件

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 $,但我也未能实现。

Kam*_*Cuk 5

表达式在赋值时求值。

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)

有用的网址: