Vejamos um simples for loop
#!/bin/bash for i in `seq 1 10`; do echo $i done
O ponto-e-vírgula AFAIK em scripts bash faz com que o shell execute o comando atual de forma síncrona e depois vá para o próximo. Pressionar enter faz literalmente o mesmo, exceto que não permite que você insira o seguinte comando, esvaziando o buffer imediatamente.
Então, por que o shell não pode “interpretar a seguinte linha
for i in `seq 1 10`; do; echo $i; done
como isso for loop
realmente funciona?
Resposta
A sintaxe de um for
loop do bash
a página do manual é
for name [ [ in [ word ... ] ] ; ] do list ; done
Os pontos-e-vírgulas podem ser substituídos por retornos de carro, conforme observado em outro lugar no bash
página do manual: “Uma sequência de uma ou mais novas linhas pode aparecer em uma lista em vez de um ponto e vírgula para delimitar comandos.”
No entanto, o inverso não é verdadeiro; você não pode substituir arbitrariamente novas linhas com ponto e vírgula. Seu script de várias linhas pode ser convertido em uma única linha, desde que você observe as regras de sintaxe acima e não insira um ponto e vírgula extra após do
:
for i in `seq 1 10`; do echo $i; done
Comentários
- O script final está errado, como @ dr01 apontou, você precisa remover o ponto-e-vírgula após
do
. - @jake, isso também indica que você deve remover o ponto e vírgula após
do
. Além disso, esta resposta explica por que você deve remover o ponto e vírgula após `do '. - E se
$i
precisa fazer parte do nome de um arquivo? Precisa de aspas duplas? -
filename_${i}
e, em seguida, - @ user4556274 de acordo com a sintaxe " for i do; done " também deve funcionar. por que não ' não?
Responde
O ponto e vírgula após do
é um erro e não deveria estar lá.
O seguinte funciona corretamente:
for i in `seq 1 10`; do echo $i; done