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