2015-02-08 103 views
2

我知道read命令將IFS中的字符分割輸入。因此,如果我將IFS設置爲空格,那麼輸入到read命令時將使用空格作爲分隔符。如下所示。IFS中的空白與IFS中的非空白之間的行爲差​​異

[[email protected] ~]$ IFS=" " 
[[email protected] ~]$ read a b c 
foo bar baz qux 
[[email protected] ~]$ echo "$a" 
foo 
[[email protected] ~]$ echo "$b" 
bar 
[[email protected] ~]$ echo "$c" 
baz qux 

我期待,如果我做出改變IFS到非空白字符,也就是說,一個冒號和我輸入使用冒號分隔符爲,應該有任何變化。但事實證明這是錯誤的。例如,在下面的輸出中,echo "$a"爲空。爲什麼?

[[email protected] ~]$ IFS=: 
[[email protected] ~]$ read a b c 
:foo:bar:baz:qux 
[[email protected] ~]$ echo "$a" 

[[email protected] ~]$ echo "$b" 
foo 
[[email protected] ~]$ echo "$c" 
bar:baz:qux 
[[email protected] ~]# echo $c 
bar baz qux 

又爲何的echo $c輸出不包含冒號?

回答

1

問題1:在下面的輸出中,echo "$a"爲空。爲什麼?

由於空白是特別如POSIX2.6.5 Field Splitting)之一定義:

3a中。 IFS白色空間在輸入的開始和結束時應該被忽略。

問題2:爲什麼echo $c的輸出不包含冒號?

由於bash執行按照IFS之前傳遞barbazqux作爲單獨的參數echo字分裂(其仍然設置爲:)。