![while 루프와 문서는 여기에 있습니다. 언제 무슨 일이 발생합니까?](https://linux55.com/image/127231/while%20%EB%A3%A8%ED%94%84%EC%99%80%20%EB%AC%B8%EC%84%9C%EB%8A%94%20%EC%97%AC%EA%B8%B0%EC%97%90%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%96%B8%EC%A0%9C%20%EB%AC%B4%EC%8A%A8%20%EC%9D%BC%EC%9D%B4%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
나는 이 while 루프를 여기 문서와 결합하여 Bash 4.3.48(1)에서 실행하고 있지만 그 논리를 전혀 이해하지 못합니다.
while read file; do source ~/unwe/"$file"
done <<-EOF
x.sh
y.sh
EOF
내 질문은 다음 부분으로 구성됩니다.
여기서 해야 할 일
read
(저는 항상read
변수를 선언하고 값을 할당하는 데 사용합니다.대화형으로, 그러나 여기서 해야 할 일을 놓쳤습니다).무슨 뜻인가요
while read
? 여기의 개념은 어디while
에서 왔습니까?문서 자체가 여기에 나타나는 경우뒤쪽에루프, 루프는 어떤 영향을 받나요? 내 말은,
done
루프 내부가 아닌 뒤에 나타나는데 , 이 두 구조 사이의 실제 연결은 무엇입니까?왜 실패했나요?
while read file; do source ~/unwe/"$file" done <<-EOF x.sh y.sh EOF
제 말은, 그렇습니다... 그러면
done
루프와 같은 줄에 있는 것이done
왜 중요한가요 ? 내 기억이 정확하다면done <<-EOF
루프가 한 줄이지만 여전히 작동하는 상황을 접한 적이 있습니다 .for
답변1
이
read
명령은 표준 입력 스트림에서 읽고 읽은 내용을 변수에 할당합니다file
(이보다 조금 더 복잡합니다.여기서 긴 토론). 표준 입력 스트림은 here-document에서 제공되며 after 루프로 리디렉션됩니다done
. 데이터가 제공되지 않는 경우어디에서나, 터미널에서 대화형으로 읽습니다. 그러나 이 경우 쉘은 입력 스트림을 이 문서에 연결하도록 배열했습니다.while read
read
명령이 0이 아닌 종료 상태를 반환할 때까지 루프가 반복됩니다 . 이는 오류가 있는 경우 또는 (가장 일반적으로) 더 이상 읽을 데이터가 없는 경우(입력 스트림이 파일 끝 상태인 경우) 발생합니다.관례적으로 호출 쉘에 오류나 "false" 또는 "no" 신호를 보내려는 모든 유틸리티는 0이 아닌 종료 상태를 반환하여 신호를 보냅니다. 0 종료 상태는 "true", "yes" 또는 "error no error"를 의미합니다. 이 상태를 확인하시겠습니까?
$?
(마지막으로 실행된 유틸리티에서만) 종료 상태는if
문과while
루프 또는 테스트가 필요한 모든 곳 에서 사용할 수 있습니다 . 예를 들어if grep -q 'pattern' file; then ...; fi
여기에 있는 문서는 다음과 같습니다.리디렉션의 한 형태. 이 경우 루프로 리디렉션됩니다. 루프 내부의 모든 내용을 읽을 수 있지만 이 경우 명령만
read
읽을 수 있습니다. 여기에서 설명서를 읽어보세요. 입력이 일반 파일에서 오는 경우 마지막 줄은 다음과 같습니다.done <filename
루프를 명령으로 생각하면 더 직관적일 수 있습니다.
while ...; do ...; done <filename
이건 상황이야
somecommand <filename
일부 쉘은 "here-strings"도 지원합니다
<<<"string"
.cat <<<"This is the here-string"
데이비드 포스터는 다음과 같이 지적합니다.두 스크립트 중 하나가 파일이나 다른 곳에서 읽을 데이터를 명시적으로 제공하지 않고 표준 입력에서
x.sh
읽는 경우 읽은 데이터는 실제로 here 문서에서 나옵니다.y.sh
x.sh
에 만 포함된 경우read a
변수a
에 문자열이 포함y.sh
되고y.sh
스크립트가 실행되지 않습니다. 이는 표준 입력이 다음과 같이 리디렉션되기 때문입니다.모두명령을 루프에 추가하면while
(또한 호출 스크립트나 명령에 의해 "상속"됨) 두 번째 줄은x.sh
루프가 읽을 수 있기 전에 "사용"됩니다.while
read
이 동작이 바람직하지 않으며 방지할 수 있는 경우그런데 좀 까다롭네요.
;
앞에 개행 문자가 없기 때문에 실패합니다done
. 앞에;
a 또는 개행 문자 가 없으면done
해당 단어는done
인수로 처리되며source
루프도 제대로 닫히지 않습니다(구문 오류입니다).모든 것을 개행으로 대체할 수 있다는 것은 거의 사실입니다
;
(적어도 명령 구분 기호인 경우).|
,&
,&&
및||
(아마 잊어버린 다른 것들도 있을 것입니다) 처럼 명령의 끝을 표시합니다.
답변2
기본적으로 객체를 문서로 생성한 다음 다시 while 루프로 리디렉션하고 남은 줄이 없을 때까지 한 줄씩 읽고 해당 줄에서 소스 명령을 실행합니다.
또 다른 방법은 다음과 같습니다.
가상선
x.sh
y.sh
다음 파일에서:
input.txt
우리는 실행할 수 있습니다
cat input.txt | while read file
do source ~/unwe/"$file"
done
여기에 있는 문서는 작업을 더욱 대화식으로 만들어 주지만 위의 예를 보면 이에 대한 더 나은 아이디어를 얻을 수 있습니다.