我想知道IFS如何影響bash中的分詞。行爲是依賴於上下文的,這種方式看起來不符合分詞的直覺。如何在bash中控制IFS分詞
一般想法似乎很簡單。從bash手冊頁引用:
shell將IFS的每個字符視爲分隔符,並將其他擴展的結果拆分爲這些字符上的單詞。 ...請注意,如果不發生擴展,則不會執行分割。
這可以通過將IFS變量設置爲','並使用逗號分隔參數列表調用shell函數來輕鬆驗證。
echo_n() {
echo Num args: $#, Args: "[email protected]"
}
(IFS=','
args=foo,bar,baz
echo_n $args
)
正如預期的那樣,這導致在三個不同的參數echo_n
Num args: 3, Args: foo bar baz
調用echo_n直接用逗號分隔的列表,因爲沒有擴展觸發失敗。
IFS=, echo_n foo,bar,baz
結果
Num args: 1, Args: foo,bar,baz
到這裏事情似乎相當扭曲的,但我可以換我的頭周圍。當我們開始爲圖片添加循環時,事情會變得更加複雜。
(IFS=,; for i in foo,bar,baz ; do echo_n $i; done)
導致
Num args: 3, Args: foo bar baz
這違背的目的for循環。
現在,我可以通過強制某種形式的擴展觸發的任何幾個bash技巧強制IFS詞分裂。例如:
(IFS=,; for i in ${NO_VAR:-foo,bar,baz} ; do echo_n $i; done)
導致
Num args: 1, Args: foo
Num args: 1, Args: bar
Num args: 1, Args: baz
(訣竅在於具有缺省值評估未定義的變量NO_VAR。)
另一個類似的特技,依靠命令替換:
(IFS=,; for i in $(echo foo,bar,baz) ; do echo_n $i; done)
所以,這裏的問題是:什麼是推薦的,慣用的方式t o是否控制執行IFS分詞的上下文?