2011年8月27日 星期六

shell script 處理含空白字元的檔名

以前我習慣寫

for f in $(ls mydir)
do
    ...
done

但遇到檔名有含空白時就炸了, 像這樣

$ ls mydir/ | cat
a b
c
$ for f in $(ls mydir); do echo $f; done
a
b
c

解法是設 IFS 這個變數

$ IFS=$'\n'
$ for f in $(ls mydir); do echo $f; done
a b
c
unset IFS

也可用這個方式在 shell script 裡做到等同於「字串陣列」

files=$(cat <<EOF
1st line
2nd line
3rd line
EOF
)
IFS=$'\n'
for f in $files
do
    echo $f
done
unset IFS

最後附上 man bash 裡的說明:

The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is ``<space><tab><new‐ line>''.

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...