echo $(cal) 和 echo "$(cal)" 之間的差異

echo $(cal) 和 echo "$(cal)" 之間的差異

我在 Linux 中使用echo $(cal)and 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. 外殼執行路徑名擴充關於分詞的結果。這在您的範例中不會產生任何差異,但是,如果您的輸出包含?*或其他全域活動字符,則可能會導致一些意外。

    這是一個簡單的例子路徑名擴充。讓我們從包含三個檔案的目錄開始:

    $ ls
    file1  file2  file3
    

    現在,讓我們定義一個字串:$ s='file?'

    現在,看到echo使用雙引號返回我們的字串,但是如果沒有雙引號,則字串將擴展為檔案名稱:

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

相關內容