2009-10-19 16 views
19

¿Cómo puedo iterar a través de un rango simple de entradas usando un ciclo for en ksh?iterando a través de una gama de entradas en ksh?

Por ejemplo, mi script actualmente hace esto ...

for i in 1 2 3 4 5 6 7 
do 
    #stuff 
done 

... pero me gustaría extender el camino rango superior a 7. ¿Existe una sintaxis mejor?

Respuesta

36

¿Brackets rizados?

for i in {1..7} 
do 
    #stuff 
done 
+0

Bingo - ¡gracias! – razlebe

+1

Vea también http://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-in-bash –

+6

Depende de la versión de ksh, no funciona en AIX . – Demosthenex

15

While loop?

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

Gracias - que harías muy bien, pero ¿hay no hay otra para la sintaxis de bucle? – razlebe

+0

+1 para la sugerencia alternativa – razlebe

+2

Solo esta funcionó con todas las versiones que probé. Estoy en UNIX usando ksh. 182 mientras que [[$ i -lt 1000]]; do i = $ (($ i + 1)) echo "asdf $ i" hecho 183 historial – mathtick

10

ksh93, Bash y zsh todos entienden C-como sintaxis for bucle:

for ((i=1; i<=9; i++)) 
do 
    echo $i 
done 

Desafortunadamente, mientras ksh y zsh entender la sintaxis gama corchete con las constantes y variables, Bash solo maneja constantes (incluido Bash 4).

+1

No funciona en AIX. Esto no es correcto en todas las versiones de KSH – Katerberg

+0

sbtorsvr391: ~/temp/pipes $ ksh $ for ((i = 1; i <= 9; i ++)) ksh: error de sintaxis: '(('inesperado $ – mathtick

+0

@mathtick: ¿Está usando ksh93 (como se especifica en mi respuesta)? –

4

seq, pero solo disponible en Linux.

for i in `seq 1 10` 
do 
    echo $i 
done 

hay otras opciones para seq. Pero las otras soluciones son muy buenas y más importantes, portátiles. Thx

+0

Por extraño que parezca esto funciona en AIX. –

+1

@ C.Ross Parece que alguien instaló 'seq' en su caja de AIX. No viene de serie (al menos no en las cajas de 6.1 que uso) – gbtimmon

+0

@gbtimmon Quién sabe. –

7

en OpenBSD, utilice jota:

for i in `jot 10`; do echo $i ; done; 
1

sólo algunos ejemplos que uso en AIX porque no hay ningún operador de rango o la SEC, abusando de Perl en su lugar.

Aquí hay un bucle, usando Perl como SEC:

for X in `perl -e 'print join(" ", 1..10)'` ; do something $X ; done 

Esto es similar, pero prefiero mientras que los bucles de lectura encima para. Sin retrocesos o problemas con los espacios.

perl -le 'print "$_ " for 1..10;' | while read X ; do xargs -tn1 ls $X ; done 

Mi favorito, hacer el englobamiento cáscara del golpe similar, en este caso las permutaciones con Perl.

perl -le 'print for glob "e{n,nt,t}{0,1,2,3,4,5}"' | xargs -n1 rmdev -dl 
5

Lo siguiente funcionará en AIX/Linux/Solaris ksh.

#!/bin/ksh 

d=100 

while (($d < 200)) 
do 
    echo "hdisk$d" 
    ((d=$d+1)) 
done 

Opcionalmente si se quería almohadilla a 5 lugares, es decir 00100 .. 00199 que podría comenzar con:

#!/bin/ksh 
typeset -Z5 d 

-Scott