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