enquanto lê a linha no shell script - como parar o loop?

4

Eu li um tutorial aqui que posso usar

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

No entanto, este script continua sendo executado com $ line sem nenhum valor. Como eu tenho que alterar o código que o script pára se a próxima linha estiver vazia ou alguma palavra "sinal" ocorrer?

Obrigado pela sua ajuda

    
por user42469 06.01.2016 / 21:52

3 respostas

5

Veja como você teria o loop while interrompido em um valor de comprimento zero de line :

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

Eu acho que o seu problema real pode estar no caractere de aspas duplas incomparável antes de "http", ou o caractere de carrapato sem correspondência no final de "inputfile". Você deve limpar as citações antes de tentar meu exemplo de código.

    
por 06.01.2016 / 22:03
2
 while read line && [ "$line" != "quit" ]; do # ...

Ou para parar em uma linha vazia:

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

ou

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

Em um tópico diferente:

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

você não precisa dos curlies, mas deve usar aspas duplas em torno da última expansão de variável.

    
por 06.01.2016 / 22:03
-1
        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

Alternativamente, para uma pausa imediata ao ler uma linha em branco ...

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

... funcionará bem.

    
por 06.01.2016 / 22:52