Shell
echo
和 for
的 POSIX 欄位拆分和雙引號行為
根據欄位拆分、雙引號和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