web-dev-qa-db-fra.com

Pour les boucles en zsh et bash

J'ai remarqué qu'il existe deux façons alternatives de créer des boucles dans zsh:

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

Ils impriment tous les deux:

1
2
3

Ma question est, pourquoi les deux syntaxes? Est $x itération à travers un autre type d'objet dans chacun d'eux?

bash fait-il une distinction similaire?

Addenda:

Pourquoi fonctionne ce qui suit?:

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done

mais celui-ci ne fonctionne pas?:

#!/bin/zsh
a=1
b=2
c=5

d=(a b c)    
# It complains with "parse error near `$d'"
for x $d; do print $x;done 
65

Plusieurs formes de commandes complexes telles que les boucles ont formes alternatives dans zsh. Ces formes sont principalement inspirées du C Shell , qui était assez courant quand zsh était jeune mais a maintenant disparu. Ces formes alternatives agissent exactement comme les formes normales, elles sont juste une syntaxe différente. Ils sont légèrement plus courts, mais moins clairs.

Le formulaire standard pour la commande for est for x in 1 2 3; do echo $x; done Et le formulaire standard pour la commande while est while test …; do somecommand; done. Ksh, bash et zsh ont une autre forme de for: for ((i = 0; i < 42; i++)); do somecommand; done, qui imite les boucles for de langages comme Pascal ou C, pour énumérer les entiers. D'autres formes exotiques qui existent dans zsh sont spécifiques à zsh (mais souvent inspirées de csh).