既然read有一个内置变量$REPLY,为什么我们需要显式声明$line或其他变量

既然read有一个内置变量$REPLY,为什么我们需要显式声明$line或其他变量

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

相关内容