한 줄씩 읽고 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 변수를 사용하여 읽은 행을 저장하려면 제거하는 것은 귀하에게 달려 있습니다.이름다른 변수 이름에 저장되는 매개변수는 엄격하게 지정하면 됩니다.