次の .txt ファイルがあります:
Marco
Paolo
Antonio
これを 1 行ずつ読み取り、各行に対して .txt 行の値を変数に割り当てたいと思います。変数が であるとすると$name
、フローは次のようになります。
- ファイルから最初の行を読み込む
- 割り当て
$name
= "Marco" - いくつかのタスクを実行する
$name
- ファイルから2行目を読み込む
- 割り当て
$name
= "Paolo"
ベストアンサー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"
上記をファイル名のスクリプトに保存すると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 ]]
最後の行が で終わらない場合に無視されることを防ぎます\n
( read
EOF に遭遇すると 0 以外の終了コードを返すため)。
ループ内のコマンドも標準入力から読み取る場合、使用されるファイル記述子はread
別のものに変更することができます(標準ファイル記述子)、例:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Bash 以外のシェルは認識しない可能性がありますread -u3
。代わりに を使用してくださいread <&3
。)