Answers:
这个有点棘手。Hauke提供的信息是正确的,只是将其解析为您的用例即可。
最简单的方法是$()
在转义时使用语法$
,以使变量定义不执行定义时的括起来的命令$()
。需要注意的是,最终结果必须eval
在实际执行时由shell 重新评估(通过),以使嵌套命令得以执行。
看一个例子要容易得多,因此请看一下这个例子,它应该使您走上正确的道路:
for((i=0;i<10;i++)); do
date +%s.%N # Print a timestamp (in format seconds.nanoseconds)
test="echo \$(date +%s.%N)" # Save a command to do the same
sleep 1 # Sleep for a second
eval "$test" # Evaluate the command saved in variable 'test'
echo # Print a new line before the next iteration
done
这是上面示例的示例输出(修剪为一个迭代):
1398832186.133661344
1398832187.139076728
您会注意到,每个循环的第二个时间戳大约在第一个之后。相反,如果您执行相同的测试而没有$
在test
定义中转义并删除eval
,则这两个时间戳几乎匹配。
eval
在大多数情况下不要养成使用习惯,但这是我不知道避免这种情况的好方法之一。希望这会有所帮助。祝好运!
eval
因为您可以通过不转义$
和使用单引号('
)而不是双引号("
)来包围命令来完成相同的操作。
echo
一个包含内容的字符串,其中包括延迟执行嵌套命令的输出。
echo
不会起作用,因为没有命令to eval
,而是一个字符串。如果您有更适合我们的示例,我们可以帮助您。
有几个级别的报价。双引号("..."
)保护的空白和一些特殊字符(~
,&
,|
,;
,...),但并不妨碍参数扩展和命令替换。
您需要'
在“危险”字符前面加上单引号()或反斜杠。
一般而言:您应该考虑使用$(tail ...)
而不是反引号。反引号是较旧的标准,但是我们所说的太旧了,$()
不会对大多数人造成问题。新版本更易于阅读并且可以嵌套。更不用说sx上的格式问题了...
$(...)
仍然会产生相同的结果-当定义了我的字符串时,shell会执行该结果。
$()
但是仍然需要单引号。
$(...)
按照Hauke的建议尝试使用,但是反斜杠是关键。