web-dev-qa-db-fra.com

Vous parcourez une gamme d'ints en ksh?

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?

23
razlebe

Accolades?

for i in {1..7}
do
   #stuff
done
39
martin clayton

En boucle?

while [[ $i -lt 1000 ]] ; do
    # stuff
   (( i += 1 ))
done
15
Lance Rushing

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;
9
Colin

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

5
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

4
cheko

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
2
Demosthenex