当逐行读取并将 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.
在您的第二次尝试中,没有名称,因此默认情况下它存储在 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 变量来存储它读取的行时,请删除姓名参数,要存储在不同的变量名中,严格指定它,仅此而已。