echo $(cal) 和 echo "$(cal)" 之间的区别

echo $(cal) 和 echo "$(cal)" 之间的区别

我在 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

有两个主要区别:

  1. 外壳执行单词拆分在未加引号的 上$(cal)。这意味着,假设 的默认值为IFS,所有空格字符串(包括换行符)都将被替换为单个空格。这是未加引号的命令的输出在一行上。

    这是一个更简单的例子:

    $ s='line     1
    > line  2'
    $ echo "$s"
    line     1
    line  2
    $ echo $s
    line 1 line 2
    

    如您所见,在第二个 中echo,即没有双引号的 中,所有空格序列都已被单个空格替换。这正是您在使用echo不带双引号的时所看到的情况echo $(cal)

  2. 外壳执行路径名扩展取决于单词拆分的结果。这在您的示例中不会产生任何差异,但是,如果您的输出包含?*或其他 glob-active 字符,则可能会导致一些意外。

    这是一个简单的例子路径名扩展. 让我们从包含三个文件的目录开始:

    $ ls
    file1  file2  file3
    

    现在,让我们定义一个字符串:$ s='file?'

    现在,echo使用双引号会返回我们的字符串,但如果没有双引号,则字符串会扩展为文件名:

    $ echo "$s"
    file?
    $ echo $s
    file1 file2 file3
    

相关内容