bash回声,带有转义反引号和$

时间:2018-12-26 21:25:10

标签: shell sed sh echo

test.sh

COMMAND1="Build `date`"
COMMAND2="echo $PATH"

echo "Command1 is: $COMMAND1"
echo "Command2 is: $COMMAND2"

输出

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

在上面的shell脚本中,如何在不评估表达式的情况下回显,即我想要Command1 is: Build `date`

我知道我可以转义`$字符,但是在我的应用程序中,它们来自上游服务,并作为参数传递给Shell脚本。甚至上游服务也无法转义它们,因为稍后在脚本中我实际上需要执行这些命令。

理想的方法是告诉echo仅扩展变量$COMMAND1,而不对其中的任何内容求值。或使用 sed 逃脱`$的所有情况,但我都无法实现。

1 个答案:

答案 0 :(得分:2)

表达式在赋值时求值。

COMMAND1="Build `date`"

`...代表命令替换(不赞成使用$( ... ))。 \“引号用于允许扩展文本。因此,首先将此命令扩展为:

COMMAND1='Build Wed Dec 26 21:09:43 UTC 2018'

然后分配发生。以后您将无法检索到用于声明变量的命令。该信息丢失。如果您有上游资源-它需要将此信息一直传递给您。

如果您希望COMMAND1包含字符串(按字面意思)

Build `date`

您可以使用单引号:

COMMAND1='Build `date`'

您以后可以使用eval或类似的组合来扩展变量,但是我建议只做一个函数

COMMAND1() {
   Build $(date)
}

echo "COMMAND1 is declared as:"
declare -f COMMAND1
echo "COMMAND1 execution returns: $(COMMAND1)"

有用的链接: