Como fazer um loop for na linha de comando?


22

Vamos dar uma simples for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

O ponto-e-vírgula AFAIK nos 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 comando a seguir, liberando 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 looprealmente funciona?

Respostas:


16

A sintaxe de um forloop da bashpágina de manual é

for name [ [ in [ word ... ] ] ; ] do list ; done

Os pontos e vírgulas podem ser substituídos por retornos de carro, conforme observado em outra parte da bashpá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".

Entretanto, o contrário não é verdade; você não pode substituir arbitrariamente novas linhas por ponto e vírgula. Seu script de múltiplas 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 o do:

for i in `seq 1 10`; do echo $i; done

2
O script final está errado, como @ dr01 apontou, é necessário remover o ponto e vírgula depois do.
Jake

11
@jake, isso também diz que você deve remover o ponto e vírgula depois do. Além disso, esta resposta explica por que você deve remover o ponto e vírgula após o `do '.
user4556274

E se $iprecisar fazer parte de um nome de arquivo? Precisa de aspas duplas?
Anônimo

18

O ponto e vírgula após doé um erro e não deve estar lá.

O seguinte funciona corretamente:

for i in `seq 1 10`; do echo $i; done 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.