O <
é o operador de redirecionamento de entrada, $SOME_VAR
provavelmente contém o nome de um arquivo. Juntos, eles faziam o loop ler as linhas do arquivo.
No seguinte código de script BASH:
while read -r line
do
if [some_condition]; then
do_thing1
do_thing2
continue
fi
done < $SOME_VAR
Qual é o significado da última linha? Especificamente, o que está sendo feito com o valor de $ SOME_VAR?
<
é o operador indireto do shell. Ele pega o arquivo fornecido e o usa como entrada padrão para o comando anterior. Esse comando seria mais ou menos análogo a:
cat $SOME_VAR | while read -r line; do
if stuff; then
consequence
else
otherstuff
fi
done
Se SOME_VAR
não fosse atribuído a um arquivo no diretório de trabalho atual (ou o caminho completo para um arquivo), o shell lançaria um erro No such file or directory
.
As outras duas respostas já cobriram a maioria dos aspectos. Eu gostaria de acrescentar que, para entender essa sintaxe, você deve interpretar o while ... done
como uma declaração única, mas complexa, e $SOME_VAR
é alimentado para esta declaração como stdin
. Ele será consumido sempre que houver necessidade de ler stdin
. Nesse caso, a instrução read
. Na verdade, não há diferença com a sintaxe cmd <in >out
padrão.
Em termos muito curtos, <
redireciona arquivo especificado à direita do símbolo <
para stdin
stream de qualquer comando ou grupo de comandos que você esteja executando.
O while read -r line; do...done < input.txt
é a maneira padrão de ler um arquivo linha por linha . Embora, é claro, $SOME_VAR
não precise ser um arquivo de texto - pode ser chamado de pipe entre outras coisas - essa é a maneira usual e é usada para evitar problemas com a divisão de palavras no shell.
Geralmente novos no shell script acham que podem fazer algo como for line in $(cat file.txt)
, mas se cada linha tiver várias palavras separadas por espaços, o loop for processará cada palavra em vez de cada linha. Algo parecido com isto:
$ for i in $(cat input.txt); do echo "$i" ; done
one
two
three
four
Isso não é bom. Por outro lado, o loop permite processar toda a linha sem problemas.
$ while read -r line; do echo "$line" ;done < input.txt
one two
three four
Você pode estar se perguntando por que não usar apenas cat | while read -r line...
, mas esse é um processo extra e uso inútil do gato .
O redirecionamento no fluxo de stdin de um loop pode ser feito com outras coisas também. Se você estiver usando bash
que suporta <<<
, você pode enviar uma string literal de texto para seu loop while.
while read -r line;do
# do something with line
done <<< "Hello World"
Um exemplo redundante? Sim, mas prova que essa sintaxe é mais sobre o redirecionamento de entrada para o loop while.
Veja também:
Tags scripting shell-script