Comment puis-je parcourir une simple plage d'entiers en utilisant une boucle for dans ksh?
Par exemple, mon script fait actuellement ceci ...
for i in 1 2 3 4 5 6 7
do
#stuff
done
... mais j'aimerais étendre la plage au-dessus de 7. Existe-t-il une meilleure syntaxe?
Accolades?
for i in {1..7}
do
#stuff
done
En boucle?
while [[ $i -lt 1000 ]] ; do
# stuff
(( i += 1 ))
done
ksh9, Bash et zsh comprennent tous la syntaxe de boucle for
de type C:
for ((i=1; i<=9; i++))
do
echo $i
done
Malheureusement, alors que ksh et zsh comprennent la syntaxe de la plage des accolades avec des constantes et des variables, Bash ne gère que les constantes (y compris Bash 4).
sur OpenBSD, utilisez jot:
for i in `jot 10`; do echo $i ; done;
Les éléments suivants fonctionneront sur AIX/Linux/Solaris ksh.
#!/bin/ksh
d=100
while (( $d < 200 ))
do
echo "hdisk$d"
(( d=$d+1 ))
done
En option, si vous souhaitez effectuer un pad à 5 emplacements, c'est-à-dire 00100 .. 00199, vous pouvez commencer par:
#!/bin/ksh
typeset -Z5 d
-Scott
seq - mais uniquement disponible sur linux.
for i in `seq 1 10`
do
echo $i
done
il existe d'autres options pour seq. Mais les autres solutions sont très agréables et plus importantes, portables. THX
Juste quelques exemples que j'utilise sous AIX car il n'y a pas d'opérateur de plage ou de séquence, abusant de Perl à la place.
Voici une boucle for, utilisant Perl comme seq:
for X in `Perl -e 'print join(" ", 1..10)'` ; do something $X ; done
C'est similaire, mais je préfère la lecture pendant les boucles pour. Aucun arrière-plan ou problème avec les espaces.
Perl -le 'print "$_ " for 1..10;' | while read X ; do xargs -tn1 ls $X ; done
Mon préféré, faites du globbing Shell comme bash, dans ce cas des permutations avec Perl.
Perl -le 'print for glob "e{n,nt,t}{0,1,2,3,4,5}"' | xargs -n1 rmdev -dl