"while" 루프 외부에서 read 문의 마지막 변수 할당을 유지합니다.

"while" 루프 외부에서 read 문의 마지막 변수 할당을 유지합니다.

$f1아래와 같은 루프 외부에서 변수 , , ... 을 에코하려고 합니다 . 내가 이해한 바로는 변수의 범위가 올바르지 않습니다. 그래서 그림과 같이 몇 가지 해결 방법을 시도했습니다.$f2while배쉬 FAQ에서:

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
done</etc/passwd

echo $f1

그러나 링크에 표시된 수정 사항을 재현할 수 없는 것 같습니다. 누군가 이 문제를 해결하는 방법에 대한 응용 사례를 제공할 수 있습니까?

답변1

링크에서 외부적으로 사용되는 변수(linecount)는 "루프" 변수로 정의되지 않습니다. 이는 메인 루프 내에서만 수정(증분)되고 "while" 문 내에서는 수정(증분)되지 않습니다.

"read -r f1 f2..." 부분을 호출하면,사용된 변수 재설정(준비) (f1 ..f7), 입력 라인을 기다리고 입력에 따라 변수를 할당합니다. 파일 끝에서 입력 라인(EOF 또는 파이프 오류)을 얻지 못하고 false를 반환하고 루프를 종료합니다. 그러나 변수가 재설정되었습니다.

set -x명령문 앞에 추가하여 "디버그 모드"를 활성화하여 직접 계산할 수 있습니다 while.

그러면 다음과 같은 결과가 생성됩니다.

++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo 'Username: bind. Home directory:/var/cache/bind'
Username: bind. Home directory:/var/cache/bind
++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo

마지막 읽기가 호출된 다음 마지막 "echo $f1"이 호출되는 것을 볼 수 있습니다.

따라서 링크에 명시된 대로 다른 저장 변수를 생성하기 전에 값을 할당한 다음 사용할 수 있습니다.

typeset f0=""
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
  f0="$f1"
done</etc/passwd
echo $f0

관련 정보