bash - 带管道的变量中的命令

Mar*_*era 4 bash pipe command-substitution

有人可以解释为什么A并且B表现不同吗?

A=`echo hello how are you | wc -w`
Run Code Online (Sandbox Code Playgroud)

CMD="echo hello how are you | wc -w"
B=`$CMD`
Run Code Online (Sandbox Code Playgroud)

他们给出不同的结果:

$echo $A
4

$echo $B
hello how are you | wc -w
Run Code Online (Sandbox Code Playgroud)

我想要的是变量中的命令,我可以在脚本的多个点执行该命令并获取不同的值进行比较。它曾经工作正常,但如果命令有管道,它就不起作用。

m19*_*19v 5

  • ``(即反引号)或 $()在 bash 中称为命令替换
  • ""- 例如用于保存字符的字面值,即数据。
  1. 在第一个示例中,执行命令echo hello how are you | wc -w并将其值4分配给A,因此您得到4

  2. 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
Run Code Online (Sandbox Code Playgroud)

  • _将字符串赋值给变量 B 并且通过 `$CMD` 不会“计算”其值_ --> 如果是这种情况,那么 `B` 将等于“echo hello how are you | wc -w”,但是它不是:它等于“你好,你好吗 | wc -w”。所以“echo”命令被执行了。它只是没有通过管道进入“wc”。 (2认同)