我在 Linux 中使用echo $(cal)
和echo "$(cal)"
,结果与图片不同。$
在这种情况下,双引号不应该干扰,那么echo "$(cal)"
与相比,是什么赋予了这种水平样式呢echo $(cal)
?
结果如下:
echo "$(cal)"
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
echo $(cal)
June 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
答案1
有两个主要区别:
外壳执行单词拆分在未加引号的 上
$(cal)
。这意味着,假设 的默认值为IFS
,所有空格字符串(包括换行符)都将被替换为单个空格。这是未加引号的命令的输出在一行上。这是一个更简单的例子:
$ s='line 1 > line 2' $ echo "$s" line 1 line 2 $ echo $s line 1 line 2
如您所见,在第二个 中
echo
,即没有双引号的 中,所有空格序列都已被单个空格替换。这正是您在使用echo
不带双引号的时所看到的情况echo $(cal)
。外壳执行路径名扩展取决于单词拆分的结果。这在您的示例中不会产生任何差异,但是,如果您的输出包含
?
或*
或其他 glob-active 字符,则可能会导致一些意外。这是一个简单的例子路径名扩展. 让我们从包含三个文件的目录开始:
$ ls file1 file2 file3
现在,让我们定义一个字符串:$ s='file?'
现在,
echo
使用双引号会返回我们的字符串,但如果没有双引号,则字符串会扩展为文件名:$ echo "$s" file? $ echo $s file1 file2 file3