次の .txt ファイルがあります。
Marco
Paolo
Antonio
行ごとに読み取りたいのですが、行ごとに .txt 行の値を変数に割り当てたいのです。私の変数が$name
であると仮定すると、フローは次のとおりです。
- ファイルから最初の行を読み取る
- 割り当て
$name
= "マルコ" - でいくつかのタスクを実行します
$name
- ファイルから 2 行目を読み取る
- 割り当て
$name
= "パオロ"
次の .txt ファイルがあります。
Marco
Paolo
Antonio
行ごとに読み取りたいのですが、行ごとに .txt 行の値を変数に割り当てたいのです。私の変数が$name
であると仮定すると、フローは次のとおりです。
$name
= "マルコ"$name
$name
= "パオロ"次の例では、引数として渡されたファイルを 1 行ずつ読み取ります。
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
これは、ループ内のファイルから行を読み取るための標準形式です。説明:
IFS=
(またはIFS=''
) 先頭/末尾の空白が削除されないようにします。-r
バックスラッシュのエスケープが解釈されないようにします。または、bash ファイルのヘルパー スクリプトに入れることもできます。コンテンツの例:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
上記が filename のスクリプトに保存されている場合、readfile
次のように実行できます。
chmod +x readfile
./readfile filename.txt
ファイルが標準の POSIX テキスト ファイルでない場合(= 改行文字で終了していない場合)、ループを変更して末尾の部分行を処理することができます。
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
ここで|| [[ -n $line ]]
は、最後の行が a で終わらない場合に無視されないようにします\n
( read
EOF に遭遇したときにゼロ以外の終了コードを返すため)。
ループ内のコマンドが標準入力からも読み取る場合、によって使用されるファイル記述子は別のものに変更できます (標準のファイル記述子read
は避けてください)。
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(非 Bash シェルは知らないかもしれません。代わりにread -u3
使用してください。)read <&3
以下を表す-r
フラグを使用することをお勧めします。read
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
から引用していman 1 read
ます。
もう 1 つの方法は、ファイル名を引数として取ることです。
更新されたコードは次のとおりです。
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"
次の Bash テンプレートを使用すると、ファイルから一度に 1 つの値を読み取って処理できます。
while read name; do
# Do what you want to $name
done < filename
入力ファイルとユーザー入力 (または stdin からのその他のもの) の両方を処理する必要がある場合は、次の解決策を使用します。
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
受け入れられた回答とbash-hackers redirection tutorialに基づいています。
ここでは、スクリプト引数として渡されたファイルのファイル記述子 3 を開き、read
この記述子を入力 ( -u 3
) として使用するように指示します。したがって、デフォルトの入力記述子 (0) を端末または別の入力ソースにアタッチしたままにし、ユーザー入力を読み取ることができるようにします。