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?

user30167
fonte

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
user4556274
fonte
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 
dr01
fonte