readには組み込み変数$ REPLYがありますが、なぜ$lineや他の変数を明示的に宣言するのですか?

readには組み込み変数$ REPLYがありますが、なぜ$lineや他の変数を明示的に宣言するのですか?

1行ずつ読み込み、IFSをnullに設定すると、次のように書くことができます。

while IFS= read -r line
do
    echo "$line"
done < <(find . -name "*.txt")

これは、以下と同じではありません。

while read -r
do
    echo "$REPLY"
done < <(find . -name "*.txt")

なぜまたはいつ他のものよりも優先されますか?

答え1

line基本変数の代わりに名前付き変数を使用するのはなぜですかREPLY

コードが何をするかを説明する方法で変数名を指定すると、コードを理解するのに役立ちます。比較する:

files=( ... )
target=...
for file in "${files[@]}"; do
    something "$file" "$target"
done

そして

a=( ... )
b=...
for c in "${a[@]}"; do
    something "$b" "$c"
done

どちらがより明確ですか?バグがある場合、どのバグを見つけやすくなりますか?

答え2

からman bashIf no names are supplied, the line read is assigned to the variable REPLY.2回目の試行では名前がないため、デフォルトではREPLY変数に格納されます。

例:

$ cat infile
1
2
3

$ while read ; do echo $REPLY; done <infile
1
2
3

REPLYただし、名前を指定するとその変数(変数)は設定されず、この場合、現在の行は指定された名前で読み取られます。

$ while read tmp; do echo $REPLY; done <infile



$

なぜまたはいつ他のものよりも優先されますか?

それは明らかです。デフォルトのREPLY変数を使用して読み取った行を保存するには、削除することはあなた次第です。名前他の変数名に格納されているパラメータは厳密に指定できます。

関連情報