ウェブサイト検索

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


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

while ループ を使用してファイルの内容を読み取る方法を説明する前に、while ループの仕組みについて簡単に説明します。 While ループは条件を評価し、条件が true の場合に指定されたコードのセットを反復処理します。

while [ CONDITION ]
do
    code block
done

while ループ 構文を詳しく見てみましょう。

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

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

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

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

SYNTAX
while read VARIABLE
do
    code
done

Linux でのパイピング

通常、ターミナルからファイルの内容を表示するには cat コマンドを使用します。また、cat コマンドの出力を grep や sort などの他のコマンドにパイプします。

同様に、 ここでは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

内部フィールド区切り文字

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

それがどのように機能するかを説明しましょう。コロン (:) が区切り文字として含まれている /etc/passwd ファイルを見てください。行から各単語を分割して、別の変数に保存できるようになりました。

以下の例では、コロンを区切り文字として /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

結果を確認してください。空白行は無視されません。また、注目すべき興味深い点は、read コマンドによって空白がどのようにトリミングされるかです。ファイルの内容を読み取るときに空白行を無視する簡単な方法は、文字列の長さがゼロかどうかをチェックする -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 の代わりに nt のみが出力されます。 -r を使用すると、バックスラッシュの解釈を防ぐことができます。

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

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