【bashシェル】パイプを使わずwhile-readループする方法


この記事はプロモーションを含みます。

bashシェル

ホーム > bashシェルスクリプト リファレンス

bashシェルスクリプトで、パイプを使用せずに、while-read文でループ処理を行う方法を解説します。

はじめに

bashシェルスクリプトで、下記のようにwhile-readとパイプを組み合わせて使うと想定外の動きになる場合があります。(while問題と言われているようです)

実行するコマンド | while read 変数
do
	実行する処理
done

本記事では、パイプを使用せずにwhile-read文でループ処理を行う方法を説明します。

構文

パイプ無しのwhile-read文の構文です。

while read 変数
do
	実行する処理
done < <(実行するコマンド)

サンプル1

テキストファイルを1行ずつ読み込み、ループ処理を行うサンプルです。
ここでは、例として以下のテキストファイルを使用します。

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの

サンプルのスクリプトです。

#!/bin/bash

file="/home/data/file1.txt"

while read line
do
	echo "${line}"
done < <(cat "${file}")

実行結果です。
この実行結果ですが、テキストの内容が表示されるだけなので、1行ずつループ処理されているか分かりづらいです。
次項でサンプル2として、各行の先頭に何行目の処理かを追記して出力してみます。

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの

サンプル2

サンプル1と同様にテキストファイルを1行ずつ読み込み、ループ処理を行います。
サンプル2では、追加で何行目の処理かを合わせて出力してみます。
下記は、例として読み込むテキストファイルです。

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの

サンプルのスクリプトです。

#!/bin/bash

file="/home/data/file1.txt"

while read line
do
	count=`expr ${count} + 1`
	echo "${count}行目:${line}"
done < <(cat "${file}")

実行結果です。
読み込んだテキストファイルの各行の先頭に、行数を追加することが出来ました。

1行目:あいうえお
2行目:かきくけこ
3行目:さしすせそ
4行目:たちつてと
5行目:なにぬねの

コメント

タイトルとURLをコピーしました