プログラミング

BashのIFS(Internal Field Separator)について

bashにおいてのIFSという変数は、forループなどで使用されるフィールドをセパレートするデリミタを変更するものです。

というのもどういうことかというと、bashのfor inが一体どういう基準で文字列を配列にしているかということをまずは知っておきましょう。
bashのfor inのデリミタは、\s \t \nです。つまり空白、tab、改行、ですね。 ( 僕はこれまでforのデリミタは\nのみだと思っていました )

つまり、

$ data-test-urls-2019-5-26
https://yuis-programming.com  プログラミング
https://fumiya.org  ブログ
$

というコマンドと出力結果があるとして、for inをこのコマンドの出力結果に対してやるとしますと、

$ for i in $( data-test-urls-2019-5-26 ) ; do echo $i ; done
https://yuis-programming.com
プログラミング
https://fumiya.org
ブログ

こうなります。これは改行だけでなく、空白スペースもデリミタに含まれていることの証明ですね。

この出力を

$ for i in $( data-test-urls-2019-5-26 ) ; do echo $i ; done
https://yuis-programming.com  プログラミング
https://fumiya.org  ブログ

こうしたい、つまりデリミタを\nだけにしたいという場合、

$ IFS=$'\n'

こうします。

IFS変数は出力をしようとしても何も出力されないので、違いがわかりにくいですが、実際は試してみれば反映されているはずです。

$ echo $IFS

(何も出力されない)

IFSは普通の変数なので、一時的にIFSを変更したいという場合は予め$ tmpIFS=$IFSをして、処理が終わったら$ IFS=$tmpIFSで戻すということができます。

bash – How to read complete line in ‘for’ loop with spaces – Ask Ubuntu
bash – What is the ‘IFS’? – Unix & Linux Stack Exchange