`echo $TEST` 在变量中扩展星号是错误吗?

Roe*_*aar 3 shell bash quoting command-substitution variable-substitution

这是 Bash 错误吗?

$ mkdir test && cd test && echo "a" > "some.file"
test$ echo '*'
*
test$ TEST=$(echo '*')
test$ echo $TEST
some.file
Run Code Online (Sandbox Code Playgroud)

为什么第二个输出是对*(所有)文件名的解析,而不仅仅是文字*输出?看起来像 Bash 中的错误?

在 Ubuntu 18.04,bash 版本 4.4.19(1)-release 上试过。预计在其他操作系统上也是如此。

Spa*_*awk 13

不,这不是错误。你已经证明

echo '*'
Run Code Online (Sandbox Code Playgroud)

将产生一个文字*. 因此,当您替换此输出时,按照以下命令

TEST=$(echo '*')
Run Code Online (Sandbox Code Playgroud)

它将放入*变量中$TEST。那么当你

echo $TEST
Run Code Online (Sandbox Code Playgroud)

glob 将在这里扩展。您可以通过运行最后一条命令、更改目录,然后再次运行来验证这一点。

*如果你说,你会得到输出

echo "$TEST"
Run Code Online (Sandbox Code Playgroud)

正如这里所解释的,双引号允许扩展变量但阻止 glob 扩展。

  • 这就是为什么我的一般方法是,如果它以美元开头,请引用它:)。是的,您可以了解不需要的特定情况 - 但在不需要的情况下引用它们几乎总是无害的,因此您也可以在任何地方引用您的变量! (8认同)
  • @Roel FWIW,经过几年的经验,您将开始将 `$TEST` 而不是 `"$TEST"` 视为代码异味,并且它变得更容易看到了。虽然它仍然没有太大的气味,所以它有时仍然会让你绊倒 (3认同)
  • @Roel 几十年前,我学会了 - 艰难的方式 - 99.99999%的时间是你的错,而不是编译器或解释器中的错误...... :) (3认同)
  • @slebetman:对于没有这种本能的我们其他人来说,`shellcheck` 会抱怨(https://www.shellcheck.net/)。 (2认同)