¿Cuál es el propósito de do
palabra clave en Bash for
sintaxis de bucle? Para mí, se siente redundante.
for i in `seq 1 2`; do echo "hi"; done
¿Por qué la sintaxis no es así?
for i in `seq 1 2`; echo "hi"; done
Estoy seguro de que sí llenar un propósito. Solo quiero aprender.
Respuesta aceptada:
Tenga en cuenta que esa sintaxis se hereda del shell Bourne.
Después del nombre de la variable, puede tener in
tener la lista de elementos dada explícitamente, o do
, para recorrer 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
Tener el do
en ambos casos (aunque no sea estrictamente necesario en el primero) hace que la sintaxis sea más consistente. También es consistente con while
/until
bucles donde do
es necesario.
while
cmd1
cmd2
do
cmd3
cmd4
done
Necesitas el do
para decir dónde está la lista de condiciones terminan los comandos.
Tenga en cuenta que el shell Bourne no admitía for i; do
. Esa sintaxis tampoco era POSIX hasta la edición de 2016 del estándar (for i do
siempre ha sido POSIX; ver 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 puedes 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, no ash
ni yash
) también admite:
for i in 1 2 3; { echo "$i";}
El shell de Bourne, ksh
y zsh
(pero no bash
) también admite:
for i { echo "$i"; }
Mientras bash
, ksh
y zsh
(pero no el shell de Bourne) soporte:
for i; { echo "$i"; }
Todos (Bourne, bash
, ksh
, zsh
) apoyo:
for i
{ echo "$i";}
ksh93
, bash
, zsh
apoyo:
for ((i=1;i<=3;i++)) { echo "$i"; }