whileループを使用してBashスクリプトでファイルを読み取るさまざまな方法


この記事では、whileループを使用してbashスクリプトでファイルを読み取る方法について説明します。ファイルの読み取りは、プログラミングの一般的な操作です。さまざまな方法と、どの方法を使用するのがより効率的かを理解している必要があります。 bashでは、1つのタスクをさまざまな方法で実行できますが、タスクを実行するための最適な方法は常に存在するため、それに従う必要があります。

whileループを使用してファイルの内容を読み取る方法を説明する前に、whileループがどのように機能するかについて簡単に説明します。 Whileループは条件を評価し、条件が真の場合に指定されたコードのセットを繰り返し処理します。

while [ CONDITION ]
do
    code block
done

whileループ構文を分解してみましょう。

  • whileループは、whileキーワードで始まり、その後に条件が続く必要があります。
  • 条件は[]または[[]]で囲む必要があります。ループを実行するには、条件が常にtrueを返す必要があります。
  • 実際のコードブロックは、doとdoneの間に配置されます。

NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

これは非常に単純な例であり、NUMBERが10以下になるまでループが実行され、echoステートメントが出力されます。

また、readコマンドを使用して、ファイルの内容を1行ずつ読み取ります。以下は、whileコマンドとreadコマンドを組み合わせる方法の構文です。これで、ファイルを入力として渡すさまざまな方法があり、それらすべてが表示されます。

# SYNTAX
while read VARIABLE
do
    code
done

Linuxでの配管

通常はソートなどを使用します。

同様に、ここではcatコマンドを使用してファイルの内容を読み取り、whileループにパイプします。デモンストレーションのために、私は/ etc/passwdファイルを使用していますが、このファイルをいじることはお勧めできません。そのため、このファイルのバックアップコピーを取り、必要に応じて試してみてください。

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

上記のコードが送信されたときに何が起こるかを分析してみましょう。

  • cat/etc/passwdはファイルの内容を読み取り、パイプを介して入力として渡します。
  • readコマンドは、catコマンドからの入力として渡された各行を読み取り、それをLREAD変数に格納します。
  • readコマンドは、EOLが解釈されるまでファイルの内容を読み取ります。

また、head、tailなどの他のコマンドを使用して、whileループにパイプすることもできます。

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Linuxでの入力リダイレクト

入力リダイレクト演算子(<)を使用して、ファイルのコンテンツをwhileループにリダイレクトできます。

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

ファイル名を変数に保存し、リダイレクト演算子を介して渡すこともできます。

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

スクリプトの引数としてファイル名を渡すこともできます。

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

内部フィールドセパレータ

さまざまな種類のファイル形式(CSV、TXT、JSON)を操作でき、カスタム区切り文字に基づいてファイルの内容を分割したい場合があります。この場合、「内部フィールドセパレーター(IFS)」を使用して、ファイルのコンテンツを分割し、変数に格納できます。

それがどのように機能するかを示しましょう。区切り文字としてコロン(:)を持つ/etc/passwdファイルを見てください。これで、各単語を1行から分割して、個別の変数に格納できます。

次の例では、区切り文字としてコロンを使用して/ etc/passwdファイルを分割し、各分割を異なる変数に格納しています。

while IFS=":" read A B C D E F G
do
    echo ${A}
    echo ${B}
    echo ${C}
    echo ${D}
    echo ${E}
    echo ${F}
    echo ${G}
done < /etc/passwd

スクリーンショットのサイズを考慮して、上のスクリーンショットでは1行に分割して表示しました。

Linuxの空の行

ファイルの内容をループするときに、空の行は無視されません。これを実証するために、以下の内容のサンプルファイルを作成しました。 4行といくつかの空の行があり、先頭の空白、末尾の空白、2行目のタブ文字、およびいくつかのエスケープ文字(\nおよび\t)があります。

while read LREAD
do
    echo ${LREAD}
done < testfile

結果を参照してください。空白行は無視されません。また、注目すべき興味深い点は、読み取りコマンドによって空白がどのようにトリミングされるかです。ファイルの内容を読み取るときに空白行を無視する簡単な方法は、文字列の長さがゼロかどうかをチェックする -zフラグを指定してテスト演算子を使用することです。同じ例を繰り返しますが、今回はテストオペレーターを使用します。

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

出力から、空の行が無視されていることがわかります。

エスケープ文字

\n \t \c などのエスケープ文字は、ファイルの読み取り時に印刷されません。これを示すために、エスケープ文字がほとんどない同じサンプルファイルを使用しています。

while read LREAD
do
    echo ${LREAD}
done < testfile

出力から、エスケープ文字の意味が失われ、\n\tの代わりにnとtのみが出力されていることがわかります。 -r を使用して、円記号の解釈を防ぐことができます。

while read -r LREAD
do
    echo ${LREAD}
done < testfile

この記事は以上です。フィードバックやヒントがありましたら、ご連絡をお待ちしております。あなたのフィードバックは、私たちがより良いコンテンツを作成するのに役立つものです。読み続け、サポートし続けてください。