Linuxパソコン・サーバーのコマンドライン言語、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