はじめに
シェルスクリプトで、インデントされたテキストファイルを while read 構文で読み込み処理したいが、インデントされている行の行頭のスペースが消えてしまうのでなんとかしたいという質問がありました。
検証環境
| |
問題
以下のようなファイルがあります。2行目がスペースでインデントされています。
| |
これを while read 構文で読み込みループさせたいが、2行目の行頭のスペースが消えてしまうということでした。
| |
解決方法は IFS 環境変数のクリア
解決方法は非常に単純で、 IFS 環境変数をクリア(空)にしてやることで対処できます。
| |
IFS 環境変数はinternal fieled separatorの省略で、 情報を分離するために利用される文字 が格納されています。
read コマンドはシェルのビルドインコマンドです。
| |
標準入力で受け取った情報を IFS 環境変数に設定されている文字列で自動的に分割した後、引数で与えられた変数名(ここではline)に格納します。
IFS= read とすることで、一時的に区切り文字列を無視するようにしています。
IFS 環境変数を覗いてみる
では IFS 環境変数とはどのような値なのでしょうか?
頑張って覗けるだけ覗いてみます。
普通に echo してみます。(ここでは -n オプションを指定して、echo コマンド自身が最後出力する改行文字を抑制しています。)
| |
なにか出力されていそうですがわかりませんね。
文字列を [...] で囲んでみます。
| |
改行文字を含んでいるようです。
文字数がいくつか確認してみます。
| |
どうやら3文字ですね。
ファイルに出力してみます。
| |
3byte。
vi で開くと更にわかりますが、これはスペース、タブ、改行の3つから構成されています。
ひとこと
while read でのインデント消える問題の解消から IFS 環境変数の話へと発展してしまいました。