%20%E5%92%8C%20echo%20%22%24(cal)%22%20%E4%B9%8B%E9%96%93%E7%9A%84%E5%B7%AE%E7%95%B0.png)
我在 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
有兩個主要區別:
外殼執行分詞關於未引用的
$(cal)
.這意味著,假設 的預設值IFS
,所有空白字串(包括換行符)都將替換為單一空格。這是未加引號的命令的輸出,位於一行。這是一個更簡單的例子:
$ s='line 1 > line 2' $ echo "$s" line 1 line 2 $ echo $s line 1 line 2
如您所看到的,在第二個(
echo
沒有雙引號的)中,所有空格序列都已被單一空格取代。這正是您在使用echo
不帶雙引號的時所看到的echo $(cal)
。外殼執行路徑名擴充關於分詞的結果。這在您的範例中不會產生任何差異,但是,如果您的輸出包含
?
或*
或其他全域活動字符,則可能會導致一些意外。這是一個簡單的例子路徑名擴充。讓我們從包含三個檔案的目錄開始:
$ ls file1 file2 file3
現在,讓我們定義一個字串:$ s='file?'
現在,看到
echo
使用雙引號返回我們的字串,但是如果沒有雙引號,則字串將擴展為檔案名稱:$ echo "$s" file? $ echo $s file1 file2 file3