리눅스 스크립트에서“while read…”사용하기


34

누군가 다음 코드가 어떻게 작동하는지 설명해 주시겠습니까?

echo '1 2 3 4 5 6' | while read a b c
do
  echo $c $b $a
done

특히,이 루프의 출력은 이유를 알고 싶습니다 3 4 5 6 2 1, 대신 3 2 16 5 4두 개의 별도의 줄에? 나는 내 마음을 감싸지 못하는 것 같습니다 ...

답변:


41

read표준 입력에서 전체 행을 읽고 행을 필드로 분할 한 후이 필드를 지정된 변수에 지정합니다. 변수보다 많은 조각이 있으면 나머지 조각이 마지막 변수에 할당됩니다.

귀하의 경우가에 $a할당 1, $b할당 2하고 $c나머지 3 4 5 6.


플로리안 감사합니다! 이제 의미가 있습니다 ... 어떤 이유로 공백은 각 변수 읽기를 구분하지만 분명히 그렇지는 않다고 생각했습니다. 도와 주셔서 감사합니다 !!
linuxgringo

24

이런 식으로 루프를 다시 작성하면 무슨 일이 일어나고 있는지 알 수 있습니다.

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 따라서 변수 ab12각각 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 .... 실제로 어떻게 작동했는지 설명해 주셔서 감사합니다. 나는 어제이 코드를
보았고

@linuxgringo 실제로, 루프 본문 read a b c true로 평가 될 때마다 실행되며 루프 조건 ( read a b c)은 두 번 이상 실행됩니다. 비트는 처음에만 참으로 평가됩니다 . 두 번째로 파이프에서 더 이상 입력을 읽을 수 없으므로 파일 끝 이 발견 read되어 false 를 리턴 합니다. help read쉘 스크립팅에서 0은 true를 의미하고 0이 아닌 것은 false를 의미한다는 점에 유의 하십시오 (자세한 내용은 "종료 상태" 에서 출력의 마지막 섹션 참조 ). 둘 이상의 입력 행을에 파이프 while read ...하면 여러 번 실행됩니다.
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.