1. 概要

このチュートリアルでは、ファイルの内容を1行ずつループする方法を説明します。 これは些細な作業のように聞こえるかもしれませんが、注意が必要な注意事項がいくつかあります。

この記事の例はBashでテストされています。 ただし、他のPOSIX互換シェルでも機能するはずです。

2. サンプルファイル

テキストファイルがあり、各行をエコーしたいとします(もちろん、 cat を使用しません)。 このファイルはlorem-ipsum.txt、と呼ばれ、その内容は次のとおりです。

Lorem
ipsum
dolor
sit
amet

3. Whileループ

各行を出力するには、bashスクリプトを作成し、 while ループを使用してファイルを反復処理し、echo-lines.shと呼びます。

while read line; do
    echo $line
done < lorem-ipsum.txt

山かっこを使用して、lorem-ipsum.txtの内容をwhileループに1行ずつ渡します。 実行すると、出力は期待どおりになります。

$ ./echo-lines.sh
Lorem
ipsum
dolor
sit
amet

ファイルの内容をループする簡単な方法を見つけたようです。 ただし、次のセクションでは、注意が必要ないくつかの注意事項を示します。

3.1. ホワイトスペース

ここで、ファイルの2行目に先頭の空白が含まれていると想像してください。

Lorem
    ipsum
dolor
sit
amet

繰り返しますが、スクリプトを実行してみましょう。

$ ./echo-lines.sh
Lorem
ipsum
dolor
sit
amet

以前と同じ出力が得られます。 ファイルの行を読み取るとき、bashは先頭の空白を区切り文字と見なすため、それらを無視します。

これを解決するには、入力フィールドの区切り文字またはIFS環境変数をクリアする必要があります。 スクリプトの先頭にステートメントを追加します。

IFS=''
while read line; do
    echo $line 
done < lorem-ipsum.txt

最初の行で、入力フィールドの区切り文字をクリアします。これで、スクリプトは期待される結果を出力します。

$ ./echo-lines.sh
Lorem
    ipsum
dolor
sit
amet

3.2. エスケープ文字

私たちはまだそこにいません。 ファイルにバックスラッシュ(bashで使用されるエスケープ文字)が含まれているとどうなるか見てみましょう。

Lorem
    ipsum
dolor
sit\
amet

ここでも、スクリプトを実行します。

$ ./echo-lines.sh
Lorem
    ipsum
dolor
sitamet

結果からわかるように、円記号が削除されるだけでなく、最後の2行も1つとして印刷されます。 デフォルトでは、readコマンドは円記号をエスケープ文字として扱います。 これは、次の改行文字が無視される場合のように、予期しない結果につながります。

これを修正するには、 read -r を使用して、円記号の解釈を無効にします。

IFS=''
while read -r line; do
  echo $line
done < lorem-ipsum.txt

これで、ファイルの内容が正しく出力されます。

$ ./echo-lines.sh
Lorem
    ipsum
dolor
sit\
amet

6. 結論

この短い記事では、ファイルの内容をループするのは簡単な作業のように見えることを学びましたが、注意が必要な注意事項がいくつかあります。 入力フィールドセパレータの環境変数を常にクリアする必要があります IFS。 また 指示する必要があります読んだエスケープ文字を解釈しないコマンド。