답변:
이런 식으로 루프를 다시 작성하면 무슨 일이 일어나고 있는지 알 수 있습니다.
echo '1 2 3 4 5 6' | while read a b c
do
echo '(iteration beginning)' a="$a" b="$b" c="$c" '(iteration ending)'
done
결과는 다음과 같습니다.
(iteration beginning) a=1 b=2 c=3 4 5 6 (iteration ending)
먼저 단일 에코 명령 만 실행됩니다. 그것이 두 번 이상 실행 되었다면, 무엇보다도 (iteration beginning)
및 (iteration ending)
부분 문자열이 두 번 이상 인쇄 되는 것을 볼 수 있습니다.
이것은 while
여기서 루프 를 갖는 것이 실제로 아무것도 달성하지 못한다는 것입니다. read
내장은 공백 구분 문자 판독 한 각 지정된 변수로한다. 추가 입력은 지정된 마지막 변수의 끝에 추가됩니다. 2 따라서 변수 a
와 b
값 1
을 2
각각 c
취하고 값 을 취합니다 3 4 5 6
.
루프 조건 (하면 while read a b c
) 번째 시간을 평가하고, (우리는 단지 그것을 텍스트의 단일 라인 파이프) 파이프에서 더 이상 사용 가능한 입력 없다 이렇게 read
명령 평가하여 거짓 대신 진정한 루프 정지 (전 사상을 수행 두 번째로 몸).
1 : 기술적이고 구체적으로 설명하기 위해 read
내장 변수는 변수 이름을 인수로 전달할 때 입력을 읽고 IFS 공백 이 발생하면이 를 별도의 "단어"로 나눕니다 ( 이 질문 및 이 기사 참조 ).
2 : read
지정된 마지막 변수에 추가 입력 필드를 방해하는 동작은 처음에는 많은 스크립터에게 직관적이지 않습니다. 그것은 당신이 그것을 고려할 때 이해하기 쉽게된다 플로리안 Diesch의 대답이 말하는 것처럼 , read
항상 전체 라인을 읽어 (시도) 것 - 그는 read
로와 루프없이 모두 사용할 수있을 것입니다.
while
이 예제에서 일반적인 목적을 달성하지 못했다고 생각했지만 그 read
명령은 나를 버렸다 ... 어쨌든 나는 " read a b c
거짓이 아니라고 한다"고 해석했다 echo ...
. 실제로 어떻게 작동했는지 설명해 주셔서 감사합니다. 나는 어제이 코드를
read a b c
true로 평가 될 때마다 실행되며 루프 조건 ( read a b c
)은 두 번 이상 실행됩니다. 비트는 처음에만 참으로 평가됩니다 . 두 번째로 파이프에서 더 이상 입력을 읽을 수 없으므로 파일 끝 이 발견 read
되어 false 를 리턴 합니다. help read
쉘 스크립팅에서 0은 true를 의미하고 0이 아닌 것은 false를 의미한다는 점에 유의 하십시오 (자세한 내용은 "종료 상태" 에서 출력의 마지막 섹션 참조 ). 둘 이상의 입력 행을에 파이프 while read ...
하면 여러 번 실행됩니다.