¿Cómo hacer un bucle for en la línea de comando?

22

Tomemos un simple for loop

#!/bin/bash

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

El punto y coma de AFAIK en los scripts de bash hace que el shell ejecute el comando actual sincrónicamente y luego pase al siguiente. Al presionar Intro, literalmente, es lo mismo, excepto que no le permite ingresar el siguiente comando, vaciando el búfer de inmediato.

Entonces, ¿por qué Shell no puede interpretar la siguiente línea?

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

¿Cómo funciona esto for looprealmente?

usuario30167
fuente

Respuestas:

16

La sintaxis de un forbucle de la bashpágina del manual es

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

Los puntos y comas pueden reemplazarse por retornos de carro, como se indica en otra parte de la bashpágina del manual: "Puede aparecer una secuencia de una o más líneas nuevas en una lista en lugar de un punto y coma para delimitar comandos".

Sin embargo, lo contrario no es cierto; no puede reemplazar arbitrariamente las nuevas líneas con punto y coma. Su secuencia de comandos multilínea se puede convertir en una sola línea siempre que observe las reglas de sintaxis anteriores y no inserte un punto y coma adicional después de do:

for i in `seq 1 10`; do echo $i; done
usuario4556274
fuente
2
El script final es incorrecto, como señaló @ dr01, debe eliminar el punto y coma después do.
Jake
1
@jake, esto también dice que debes eliminar el punto y coma después do. Además, esta respuesta explica por qué debe eliminar el punto y coma después de 'do'.
user4556274
¿Qué pasa si $inecesita ser parte de un nombre de archivo? ¿Necesita comillas dobles?
Anónimo el
18

El punto y coma después does un error y no debe estar allí.

Lo siguiente funciona correctamente:

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