看似相似的 Bash 脚本在输出上存在差异

看似相似的 Bash 脚本在输出上存在差异

scrap.sh我有一个包含两个文件和的文件夹data.txt。在 bash 脚本中,我有以下脚本

x="$(ls -l)"
echo $x

运行此脚本的输出全部在一行上

total 4 -rw-rw-r-- 1 gary gary 0 Feb 9 21:52 data.txt -rw-rw-r-- 1 gary gary 21 Feb 9 22:00 scrap.sh

但是,当我将脚本更改为单行时

echo "$(ls -l)"

我明白了

total 4
-rw-rw-r-- 1 gary gary  0 Feb  9 21:52 data.txt
-rw-rw-r-- 1 gary gary 16 Feb  9 22:01 scrap.sh

为什么输出结果会有差异?!第一个脚本将所有内容放在一行中,而下一个脚本则将所有内容放在两行中。这两个脚本的功能似乎相同。

答案1

x="$(ls -l)"
echo $x

通过不加引号,$x您可以让 shell 对扩展值执行分词。结果是每个块(如data.txt或 )都作为单独的参数-rw-rw-r--发送到echo。换行符和多个连续空格不再“分隔”子字符串,它们分隔 shell 中的参数,并且不会到达echo。该工具获取多个参数并打印它们,用单个空格分隔。

单词拆分并不是唯一发生的事情,还有文件名生成。不过,对于您的特定情况,后者没有影响。请阅读这些 答案了解一般情况。

请注意,如果您运行echo $(ls -l)(即不带引号),结果将类似于echo $x。您不仅将代码片段更改为一行;还添加了缺少的引号。因此存在差异。

echo "$(ls -l)"本身是错误的,原因另有所指。参见我的这个问题。我理解(我希望)您只是将它与原始的两行代码进行比较。如果它不是唯一的代码,那么两行代码(添加引号后)可能是合理的。此声明在回答已经链接的问题

相关内容