我有一些帶有數據的製表符分隔的文件。我正在處理它一次讀取一行到一個數組中。但是,解析此命令的IFS參數存在一些嚴重問題。讀取循環時解析IFS參數的問題?如果不是爲什麼?
下面這個簡短的例子可以在幾個bash版本和幾個系統Windows/cygwin,linux和BSD之間重現。
比方說,我想打印與表狀框架的每一行(這是不相關的 - 讀取相關的):
$ IFS= echo -e "1 2 3\t4 5\t6" | while IFS=$'\t' read -r -a array ; do for field in ${array[@]} ; do echo -n "| $field " ; done ; echo "|" ; done
結果我得到的是:
| 1 | 2 | 3 | 4 | 5 | 6 |
經過幾次嘗試之後,獲得預期行爲的唯一方法是覆蓋全局IFS變量(爲了便於將其包裝在子外殼中):
$ echo -e "1 2 3\t4 5\t6" | (export IFS=$'\t' ; while read -r -a array ; do for num in ${array[@]} ; do echo -n "| $num " ; done ; echo "|" ; done)
| 1 2 3 | 4 5 | 6 |
現在的問題是:爲什麼IFS參數/變量的行爲如此怪異?它背後有沒有邏輯? - 或 - 我錯過了什麼?
'用於$ {array [@]}中的字段'string-拆分字段。你需要在引號**中使用'for $ {array [@]}「**中的字段來保留邊界。 – 2014-10-20 00:08:41
......這就是說你的解析是完美的,但你在輸出端搞亂了它。 – 2014-10-20 00:15:39