我有一个requirements.txt
包含未来安装依赖项的文件。该文件的每一行只有一个名称:
$cat requirements.txt
pandas
numpy
...
我的实际代码的某些部分如下所示:
packages=$(cat "requirements.txt") || exit
当我做echo $packages
而不是"$packages"
,我得到以下结果
echo $packages
pandas numpy ...
VS
echo "$packages"
pandas
numpy
...
我很难理解分裂是如何发生的。对我来说,看起来未加引号的版本不会拆分字符串,而双引号会做一些奇怪的事情并逐行打印结果,即使它们应该防止拆分(也就是说,我希望结果是单行)我在这里遗漏了一些明显的东西吗?
该变量
packages
包括多行,由换行符分隔 - 当您回显带引号的扩展时,这正是您所看到的,因为整个多行字符串作为单个参数传递给echo
命令。当您回显未引用的扩展时,它会受到分词(和 glob 扩展 - 尽管这在这里不相关,因为您的输入不包含任何 globbing 字符)。分词基于
IFS
变量的值,默认由空格、制表符和换行符组成。每个IFS
-delimited 标记作为单独的参数传递给echo
,它依次输出它们中的每一个,由单个空格分隔。进一步阅读:
shell 变量的扩展以及 glob 和 split 对它的影响
什么时候需要双引号?