[[ -n "$line" ]]
testa se $line
(a variável acabou de ler por read
) não está vazia. É útil, pois read
retorna um sucesso se e somente se vir um caractere de nova linha antes do fim do arquivo. Se a entrada contiver um fragmento de linha sem uma nova linha no final, esse teste detectará isso e o loop também processará essa linha final incompleta. Sem o teste extra, essa linha incompleta seria lida em $line
, mas ignorada pelo loop.
A construção cmd1 || cmd2
é, é claro, igual ao equivalente em C. O segundo comando é executado se o primeiro retornar um status falso e o resultado é o status de saída do último comando executado.
Compare:
$ printf 'foo\nbar' | ( while read line; do echo "in loop: $line" ; done ; echo "finally: $line" )
in loop: foo
finally: bar
e
$ printf 'foo\nbar' | ( while read line || [[ -n $line ]]; do echo "in loop: $line" ; done ; echo "finally: $line" )
in loop: foo
in loop: bar
finally: