![为什么我观察到 echo 的不同行为?](https://linux22.com/image/26374/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%A7%82%E5%AF%9F%E5%88%B0%20echo%20%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A1%8C%E4%B8%BA%EF%BC%9F.png)
我观察到 echo 的以下行为
#!/bin/bash
x=" hello"
echo $x
echo "$x"
现在当我运行上面的代码时我得到
ronnie@ronnie:~$ bash test.sh
hello
hello
ronnie@ronnie:~$
那么,有人可以向我解释为什么whitespace
在第一种情况下不存在于输出中,并且还向我指出定义此行为的文档。
答案1
这不是echo
行为。这是一种bash行为。当您使用echo $x
bash 表单时,请使用以下命令进行处理(视为␣
空格):
echo␣␣hello
然后这个命令被标记化并且 bash 得到两个标记:echo
因此hello
输出只是hello
当您使用该echo "$x"
表单时,bash 在分词器的输入处具有以下内容:
echo␣"␣hello"
因此它有两个标记echo
和␣hello
,所以输出是不同的。
答案2
您看到不同输出的原因是该echo[1 space]Hello
行在语法上等于echo[5 spaces]Hello
。空格将被忽略,单词“Hello”将被视为 的参数echo
。第一行,以最简单的形式,与您所说的非常相似echo "Hello"
。在第二行中,您已明确包含一个前导空格作为echo
,的参数的一部分echo " Hello"
。
在第一行中,您将 5 个字符的字符串传递给echo
,在第二行中,您将 6 个字符的字符串传递给echo
。
因此,事实上,echo
在这两种情况下, 的行为是相同的,只是传递给echo
它的字符串发生了变化。