有人能解释一下为什么A
和B
的行为不同吗?
A=`echo hello how are you | wc -w`
并且
CMD="echo hello how are you | wc -w"
B=`$CMD`
它们给出不同的结果:
$echo $A
4
$echo $B
hello how are you | wc -w
我想要的是一个命令在一个变量中,可以在脚本的多个地方执行并得到不同的值进行比较。 这过去效果很好,但如果命令中有管道符号,则无法正常工作。
有人能解释一下为什么A
和B
的行为不同吗?
A=`echo hello how are you | wc -w`
并且
CMD="echo hello how are you | wc -w"
B=`$CMD`
它们给出不同的结果:
$echo $A
4
$echo $B
hello how are you | wc -w
``
(即反引号)或 $()
在 bash 中被称为命令替换。""
- 例如用于保留字符的字面值,即数据。echo hello how are you | wc -w
并将其值 4
分配给 A
,因此您获得了 4
。B
,通过 `$CMD`
,|
不会被"评估",因为有延迟单词拆分(有关详细信息,请参见这里),因此您将得到 hello how are you | wc -w
。您可以使用 eval
命令来完成所需操作,如下所示:
CMD="echo hello how are you | wc -w"
echo `eval $CMD` # or just eval "$CMD"
# Output is 4
$CMD
不对其进行“评估”。如果是这种情况,那么B
将等于“echo hello how are you | wc -w”,但它并不等于该值,而是等于“hello how are you | wc -w”。因此,echo
命令确实被执行了,只是没有管道传递到wc
。 - k314159eval "$CMD"
,而不是eval $CMD
。否则,如果您的字符串拆分包含任何通配符,可能会将文件名注入到代码中。 - Charles Duffy