Como fazer um loop for na linha de comando?

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *