Tenga en cuenta que esa sintaxis se hereda del shell Bourne.
Después del nombre de la variable, puede tener in
que tener la lista de elementos dada explícitamente o do
hacer un bucle sobre los parámetros posicionales.
for i in 1 2 3
do
echo "$i"
done
O
set 1 2 3
for i do
echo "$i"
done
Tenerlo do
en ambos casos (incluso si no es estrictamente necesario en el primero) genera una sintaxis más consistente. También es consistente con los bucles while
/ until
donde do
es necesario.
while
cmd1
cmd2
do
cmd3
cmd4
done
Necesita el do
para decir dónde termina la lista de comandos de condición .
Tenga en cuenta que el shell Bourne no era compatible for i; do
. Esa sintaxis tampoco fue POSIX hasta la edición 2016 del estándar ( for i do
siempre ha sido POSIX; vea el error relacionado con el grupo de Austin ).
zsh
tiene algunas formas abreviadas como:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
O soporte para más de una variable:
for i j (1 a 2 b) echo $i $j
(aunque no puede usar in
o do
como nombre de variable en lugar de j
arriba).
Incluso si rara vez se documenta, la mayoría de los shells tipo Bourne (Bourne, ksh, bash, zsh, not ash
ni yash
) también admiten:
for i in 1 2 3; { echo "$i";}
El shell Bourne ksh
y zsh
(pero no bash
) también admiten:
for i { echo "$i"; }
Mientras bash
, ksh
y zsh
(pero no el shell Bourne) soporte:
for i; { echo "$i"; }
Todos (Bourne, bash
, ksh
, zsh
) de soporte:
for i
{ echo "$i";}
ksh93
, bash
, zsh
Soporte:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; el comando puede ser terminado por una nueva línea o punto y coma. Tiene un poco más de sentido paraif
/while
(el primero con enthen
lugar dedo
), pero en principio esos podrían haberlo omitido y requerido una subshell o llaves para el uso (raro) de múltiples comandos. Sospecho que la verdadera razón por la que lo hace el shell Bourne es porque ALGOL lo hace, y deberíamos alegrarnos de quedone
no se deletreeod
.od
ya se usaba como el nombre del programa Octal Dump.for i do
es Bourne y POSIX, pero no funcionará en algunas versiones antiguas de conchas de cenizas IIRC.for i in "$@"
no funcionará en el shell Bourne si$IFS
no contiene el carácter de espacio.for i<newline>do
es de hecho el más portátil si necesita considerar sistemas BSD muy antiguos. Ver in-ulm.de/~mascheck/various/bourne_args para más detalles