while 루프 끝의 구문은 무엇입니까?

while 루프 끝의 구문은 무엇입니까?

다음 BASH 스크립트 코드에서:

while read -r line
do
    if [some_condition]; then
        do_thing1
        do_thing2
        continue
    fi
done < $SOME_VAR

마지막 줄은 무엇을 의미하나요? 구체적으로 $SOME_VAR의 가치는 무엇입니까?

답변1

<입력 리디렉션 연산자 이며 $SOME_VAR파일 이름을 포함할 수 있습니다. 함께 루프가 파일에서 줄을 읽도록 합니다.

답변2

<쉘 간접 연산자입니다. 제공된 파일을 가져와서 이전 명령의 표준 입력으로 사용합니다. 명령은 대략 다음과 같습니다.

cat $SOME_VAR | while read -r line; do
  if stuff; then
     consequence
  else
     otherstuff
  fi
done

SOME_VAR현재 작업 디렉터리(또는 파일의 전체 경로)에 할당된 파일이 없으면 셸에서 오류가 발생 합니다 No such file or directory.

답변3

다른 두 답변은 이미 대부분의 측면을 다루고 있습니다. 이 구문을 이해하려면 해당 명령문을 while ... done단일하지만 복잡한 명령문으로 해석하고 $SOME_VAR해당 명령문을 stdin. 읽기가 필요할 때마다 소비됩니다 stdin. 이 경우 진술 read. 실제로 표준 구문과 차이는 없습니다 cmd <in >out.

답변4

즉, <리디렉션문서실행 중인 명령이나 명령 그룹에 대한 스트림을 기호 오른쪽에 지정합니다 <.stdin

이것은 while read -r line; do...done < input.txt파일을 읽는 표준 방법입니다.한 줄씩. 물론 $SOME_VAR텍스트 파일일 필요는 없습니다. 명명된 파이프 등일 수 있습니다. 이는 쉘에서 단어 분할 문제를 방지하는 데 사용되는 일반적인 접근 방식입니다.

쉘 스크립팅을 처음 접하는 사람들은 비슷한 일을 할 수 있다고 생각하는 경우가 많습니다 for line in $(cat file.txt). 그러나 각 줄에 공백으로 구분된 여러 단어가 있는 경우 for 루프는 각 줄 대신 각 단어를 처리합니다. 이 같은:

$ for i in $(cat input.txt); do echo "$i" ; done
one
two
three
four

이것은 좋지 않습니다. 반면에 while 루프를 사용하면 문제 없이 전체 행을 처리할 수 있습니다.

$ while read -r line; do echo "$line" ;done < input.txt
one two
three four

그냥 사용하지 않는 이유가 궁금할 수도 있지만 cat | while read -r line...이는 추가 프로세스이며고양이의 쓸모없는 사용.


표준 입력 스트림을 루프로 리디렉션하는 것도 다른 방법으로 수행할 수 있습니다. bashsupport 를 사용하는 경우 <<<텍스트의 문자열 리터럴을 while 루프로 보낼 수 있습니다.

while read -r line;do
    # do something with line
done <<< "Hello World"

중복되는 예인가요? 예, 하지만 이와 같은 구문은 입력을 while 루프로 리디렉션하는 것에 관한 것입니다.

또한보십시오:

관련 정보