Eu li que é ruim escrever coisas como for line in $(command)
: a maneira correta parece ser:
command | while IFS= read -r line; do echo $line; done
Isso funciona muito bem. Mas e se o que eu quero repetir for o conteúdo de uma variável , não o resultado direto de um comando?
Por exemplo, imagine que você crie o seguinte arquivo quickfox
:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
Eu gostaria de poder fazer algo assim:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
$variable
quando usá-lo, caso contrário, owhile
loop receberá apenas uma linha de entrada. Ver, por exemplo, a diferença na produção entreecho $variable
vsecho "$variable"
oucat <<< $variable
vscat <<< "$variable"
.variable=$(cat quickfox)
própria pergunta do OP fornece um exemplo do que eu estava falando. Usar isso$variable
entre aspas duplas inclui as novas linhas; usá-lo sem que as novas linhas sejam convertidas em espaços pelo shell. Se você está lendo e processando linha por linha, isso faz uma enorme diferença - no primeiro você tem várias linhas de entrada, no segundo você tem apenas uma linha de entrada. Os dados de entrada são superficialmente semelhantes, mas, na prática, completamente diferentes nesses dois casos.cat <<< "$variable" | wc -l
retorna 5.cat <<< $variable | wc -l
retorna 1. Se você deseja / precisa preservar espaços em branco (incluindo novas linhas, guias, espaços únicos ou múltiplos) em uma variável, DEVE citar duas vezes a variável ao usá-la, caso contrário todos eles serão transformados em um único espaço entre cada "palavra".