Bashスクリプトを書くとき、ファイルを行ごとに読み取る必要がある状況にいることがあります。 たとえば、スクリプトで処理するデータを含むテキストファイルがある場合があります。
このチュートリアルでは、Bashでファイルを行ごとに読み取る方法について説明します。,
ファイルを行ごとに読み込む構文#
ファイルを行ごとに読み込むための最も一般的な構文は次のとおりです。
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
または同等の単一行バージョン:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
それはどのように動作しますか?
入力ファイル(input_file
)は、whileループにリダイレクトされたファイルの名前です。 read
コマンドはファイルを行ごとに処理し、各行をline
変数に割り当てます。 すべての行が処理されると、whileループは終了します。,
デフォルトでは、read
コマンドはバックスラッシュをエスケープ文字として解釈し、前後の空白をすべて削除します。 バックスラッシュエスケープを無効にするには、-r
オプションを使用してコマンドを呼び出し、トリミングを無効にするには、内部フィールド区切り文字(IFS
)がクリアされます。
代わりにecho
コードを移植性を高め、不要な動作を避けるために使用しています。, たとえば、行に”-e”などの値が含まれている場合は、echoオプションとして扱われます。
ファイルを行ごとに読み込む例#
次の例を見てみましょう。 最も人気のあるLinuxディストリビューションのいくつかのリストを含むdistros.txt
という名前のファイルがあり、そのパッケージマネージャがカンマで区切られているとします(,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
ファイルを行ごとに読み込むには、ターミナルで次のコードを実行します。
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
コードはファイルを行ごとに読み込み、各行を変数に割り当てて出力します。 基本的には、cat
コマンドを使用してファイルの内容を表示する場合と同じ出力が表示されます。
aptを使用するディストリビューションのみを印刷したい場合はどうすればよいですか?, 一つの方法は、if
ステートメントを使用し、その行にapt部分文字列が含まれているかどうかを確認することです。
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
ファイルを行ごとに読み込むときは、read
コマンドに複数の変数を渡すこともできます。IFS
に基づいて行をフィールドに分割します。 最初のフィールドは最初の変数に割り当てられ、二番目のフィールドは二番目の変数に割り当てられます。 変数よりも多くのフィールドがある場合、残りのフィールドは最後の変数に割り当てられます。,
次の例では、IFS
をコンマ(,
)に設定し、二つの変数distro
とpm
をread
コマンドに渡します。,行の先頭から最初のコンマまでは最初の変数(distro
)に割り当てられ、残りの行は第二の変数(pm
)に割り当てられます:
while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora
ファイル読み取りメソッド#
プロセス置換を使用する#
プロセス置換は、コマンドからの出力をファイルとして使用できる機能です。
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
here文字列を使用する#
here文字列はhereドキュメントの変形です。, 文字列(cat input_file )
改行を保持します。
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
ファイル記述子を使用して#
ファイル記述子を使用してループへの入力を提供することもできます。
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
ファイル記述子シェル内部ファイル記述子との競合を避けるために、4と9の間。
結論#
Bashでは、whileループとread
コマンドを使用してファイルを行ごとに読み取ることができます。
コメントを残す