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
逃脱`
和$
的所有情况,但我都无法实现。
答案 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)"
有用的链接: