シェルスクリプトから行を読みながら - ループを停止する方法は?

シェルスクリプトから行を読みながら - ループを停止する方法は?

ここで動作するチュートリアルを読んだ。

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

...うまくいくでしょう。

関連情報