쉘 스크립트에서 라인을 읽는 동안 - 루프를 중지하는 방법은 무엇입니까?

쉘 스크립트에서 라인을 읽는 동안 - 루프를 중지하는 방법은 무엇입니까?

여기에서 작동하는 튜토리얼을 읽었습니다.

while read line
do 
wget -x "http://someurl.com/${line}.pdf" -o ${line}.pdf
done < inputfile

그러나 스크립트는 계속 실행되며 $line에는 값이 없습니다. 다음 줄이 비어 있거나 "신호" 단어가 나타나는 경우 스크립트가 중지되는 코드를 어떻게 변경할 수 있습니까?

당신의 도움을 주셔서 감사합니다

답변1

다음은 길이 값 0에서 while 루프를 중지하는 방법입니다 line.

#!/usr/bin/bash
while read line
do
    if [[ -z $line ]]
    then
         exit
    fi
    wget -x "http://someurl.com/${line}.pdf" 
done < inputfile

실제 문제는 "http" 앞의 일치하지 않는 큰따옴표 문자 또는 "inputfile" 끝에 있는 일치하지 않는 백틱 문자에 있을 수 있다고 생각합니다. 내 코드 예제를 시도하기 전에 참조를 정리해야 합니다.

답변2

 while read line && [ "$line" != "quit" ]; do # ...

아니면 빈 줄에서 멈추세요:

 while read line && [ "$line" != "" ]; do # ...

또는

 while read line && [ -n "$line" ]; do # ...

다양한 주제:

"http://someurl.com/$line.pdf" -o "$line.pdf"

중괄호는 필요하지 않지만 마지막 변수 확장 주위에는 큰따옴표를 사용해야 합니다.

답변3

        line=\ ; PS4='${#line}: + '
        while   read line <&$((${#line}?0:3))
        do      : "$line"
        done    <<msg 3</dev/null
        one nice thing about allowing shell expansions to self test
        is  that the shell already has mechanisms in place for the
        evaluation. its doing it all the time anyway. theres almost
        nothing for you to do but to let it fall into place.
        For example:
        ${line##*[ :: i doubt very seriously the shell will read any of this :: ]*}
msg

1: + read line
59: + : 'one nice thing about allowing shell expansions to self test'
59: + read line
58: + : 'is  that the shell already has mechanisms in place for the'
58: + read line
59: + : 'evaluation. its doing it all the time anyway. theres almost'
59: + read line
52: + : 'nothing for you to do but to let it fall into place.'
52: + read line
12: + : 'For example:'
12: + read line
0: + : ''
0: + read line

아니면 빈 줄을 읽은 후 바로 휴식을 취하세요...

while   read line && ${line:+":"} break
do    : stuff
done

...잘 작동할 거예요.

관련 정보