다음 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...
이는 추가 프로세스이며고양이의 쓸모없는 사용.
표준 입력 스트림을 루프로 리디렉션하는 것도 다른 방법으로 수행할 수 있습니다. bash
support 를 사용하는 경우 <<<
텍스트의 문자열 리터럴을 while 루프로 보낼 수 있습니다.
while read -r line;do
# do something with line
done <<< "Hello World"
중복되는 예인가요? 예, 하지만 이와 같은 구문은 입력을 while 루프로 리디렉션하는 것에 관한 것입니다.
또한보십시오: