Notez que cette syntaxe est héritée du shell Bourne.
Après le nom de la variable, vous pouvez soit in
avoir explicitement la liste des éléments, soit do
parcourir les paramètres de position.
for i in 1 2 3
do
echo "$i"
done
Ou
set 1 2 3
for i do
echo "$i"
done
Avoir le do
dans les deux cas (même si ce n'est pas strictement nécessaire dans le premier) rend la syntaxe plus cohérente. C'est également compatible avec les while
/ until
boucles où le do
est nécessaire.
while
cmd1
cmd2
do
cmd3
cmd4
done
Vous avez besoin de do
pour savoir où se termine la liste des commandes de condition .
Notez que le shell Bourne ne prend pas en charge for i; do
. Cette syntaxe n'était pas non plus POSIX jusqu'à l'édition 2016 de la norme (elle for i do
a toujours été POSIX; voir le bogue lié au groupe Austin ).
zsh
a quelques formes abrégées comme:
for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i
Ou prendre en charge plusieurs variables:
for i j (1 a 2 b) echo $i $j
(bien que vous ne puissiez pas utiliser in
ou do
comme nom de variable à la place de j
ci - dessus).
Même s'ils sont rarement documentés, la plupart des coquilles de type Bourne (Bourne, ksh, bash, zsh, not ash
ni yash
) prennent également en charge:
for i in 1 2 3; { echo "$i";}
Le shell Bourne, ksh
et zsh
(mais pas bash
) prend également en charge:
for i { echo "$i"; }
Alors que bash
( ksh
et zsh
pas le shell Bourne), le support:
for i; { echo "$i"; }
Tous (Bourne, bash
, ksh
, zsh
) soutien:
for i
{ echo "$i";}
ksh93
, bash
, zsh
Soutien:
for ((i=1;i<=3;i++)) { echo "$i"; }
for
; la commande peut être terminée par une nouvelle ligne ou un point-virgule. Cela fait un peu plus sens pourif
/while
(le premier avecthen
plutôt quedo
), mais en principe, ceux-ci auraient pu l'omettre et nécessiter un sous-shell ou des accolades pour l'utilisation (rare) de plusieurs commandes. Je soupçonne que la véritable raison pour laquelle Bourne Shell le fait est qu’ALGOL le fait, et nous devrions nous réjouir de nedone
pas l’épelerod
.od
a déjà été utilisé comme nom du programme Octal Dump.for i do
est Bourne et POSIX, mais ne fonctionnera pas dans certaines anciennes versions de shells IIRC à base de cendres.for i in "$@"
ne fonctionnera pas dans le shell Bourne si$IFS
ne contient pas le caractère espace.for i<newline>do
est en effet le plus portable si vous devez prendre en compte de très vieux systèmes BSD. Voir in-ulm.de/~mascheck/various/bourne_args pour plus de détails