bashの地味な罠「IFS」で落とし穴にはまった
はい、未だにbashを触ってるわけなんですが、他の人が作ったり修正したもので
後から予想外の挙動になったりしたりします。
結論から書くと、今回はIFSでセパレータを指定していたため、スペースで分けてる部分がおかしい挙動になっていました。
●元プログラム
DATA="1 2 3"
for dat in $DATA ; do
echo "$dat"
done
↓
1
2
3
これ、datがfor文で1,2,3と回るわけなんですが、
他の部分でIFSを指定した人がいて、想定した挙動になっていませんでした。
●変更後
IFS=,
DATA="1 2 3"
for dat in $DATA ; do
echo "$dat"
done
↓
1 2 3
for文は「1 2 3」という1つの文字列として扱ってしまいます。
IFSがこのプログラム上のセパレータをカンマだけに指定してしまっているためです。
通常、bashだとスペース、タブ、改行などがセパレータとして許容されているのですが、
IFS=,とした場合、カンマだけになるようです。
参考:
https://www.server-memo.net/shellscript/ifs.html
コメント