
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 bash
、If 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変数を使用して読み取った行を保存するには、削除することはあなた次第です。名前他の変数名に格納されているパラメータは厳密に指定できます。