Shell

echofor 的 POSIX 欄位拆分和雙引號行為

  • February 6, 2021

根據欄位拆分雙引號for 循環的 POSIX 標準以及以下範例,我無法理解為什麼在數字之間使用雙引號會echo "$s"顯示新行,而在數字之間使用雙引號for x in "$s"不會顯示新行. 有人可以澄清一下嗎?

$ s=$(seq 1 4)
$ echo $s
1 2 3 4
$ echo "$s"
1
2
3
4
$ for x in $s; do echo $x; done
1
2
3
4
$ for x in "$s"; do echo $x; done
1 2 3 4

正如您正確提到的,IFS(欄位拆分)環境變數在這裡起著重要作用。通常,IFS設置為包括<space><tab><newline>字元。這意味著當變數上沒有使用引號時,shell 解釋器將IFS盡可能按值將其分解為單獨的參數(它甚至壓縮多個IFS字元)。

因此,在您的s變數中,始終存在以下值。其餘的取決於解釋。

1<newline>2<newline>3<newline>4

在第一個for中,shell$s在執行之前拆分for並執行四次循環。對於以下內容echo,沒有任何其他要拆分的內容,因此每個元素都列印在一行上(這就是這樣echo做的)。

如上所述,對於整個值,第二個for將只執行一次。s現在發生的情況是,shell在傳遞給之前打破了s變數(因為沒有雙引號)。這意味著字元將變得無關緊要,每個數字只是一個參數。當獲得多個參數時,它將以相同的順序列印它們,用空格字元分隔。IFS``echo``x``<newline>``echo

引用自:https://unix.stackexchange.com/questions/632945