为什么 bash 将相邻的 SPACE 压缩为一个?

Yis*_*ang 1 bash shell

$ ourSite="super    user"
$ echo $outSite
super user
$ echo "$outSite"
super    user
Run Code Online (Sandbox Code Playgroud)

如果我们不使用双引号来引用变量,bash 会自动将相邻的空格压缩为一个。

我徘徊为什么bash要这样做?该变量只是一串字符,默认情况下将变量替换为原来的变量不是更好吗?

Isa*_*tch 5

这里没有任何压缩。你的例子:

 echo $outSite
Run Code Online (Sandbox Code Playgroud)

相当于:

echo super    user
Run Code Online (Sandbox Code Playgroud)

与所有 shell 命令一样,echo 命令不会看到整个命令行。相反,它会看到一个由 shell 解析的参数数组。就像 bash(1) 中所说的那样,命令行参数与下一个参数之间用1 个或多个空格分隔。因此,当 shell 解析命令行时,它会一个一个地拉出参数,并将它们传递给 echo。(我们将跳过 echo 不是一个单独的程序这一事实,因为从概念上讲它就像一个程序。)所以 echo 看到第一个参数“super”和第二个参数“user”,甚至不知道有多少个空格分开这两个论点。它用一个空格分隔符一个一个地打印它们。另一个命令:

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

完全等同于

echo "super    user"
Run Code Online (Sandbox Code Playgroud)

传递一个参数,该参数嵌入了空格,这些空格会乖乖地打印出来。