2009-10-19 7 views
19

In che modo è possibile scorrere un semplice intervallo di int che utilizza un ciclo for in ksh?Iterating attraverso un intervallo di ints in ksh?

Per esempio, il mio script attualmente fa ...

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

... ma mi piacerebbe estendere il modo intervallo sopra 7. C'è una sintassi migliore?

risposta

36

Staffe di ricci?

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

Bingo - grazie! – razlebe

+1

Vedere anche http://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-in-bash –

+6

A seconda della versione di ksh, non funziona in AIX . – Demosthenex

15

Durante il ciclo?

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

Grazie - che avrebbe fatto bene, ma c'è nessun altro per la sintassi del loop? – razlebe

+0

+1 per il suggerimento alternativo – razlebe

+2

Solo questo ha funzionato su tutte le versioni che ho provato. Sono su UNIX usando ksh. 182 mentre [[$ i -lt 1000]]; do i = $ (($ i + 1)) echo "asdf $ i" terminato 183 cronologia – mathtick

10

ksh93, Bash e zsh tutti comprendono C-like sintassi for ciclo:

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

Purtroppo, mentre ksh e zsh comprendere la sintassi ricci gamma coppia con costanti e variabili, Bash gestisce solo le costanti (incluso Bash 4).

+1

Non funziona su AIX. Questo non è corretto in tutte le versioni di KSH – Katerberg

+0

sbtorsvr391: ~/temp/tubi $ ksh $ per ((i = 1; i <= 9; i ++)) ksh: errore di sintassi: '((' inaspettato $ – mathtick

+0

@mathtick: stai usando ksh93 (come specificato nella mia risposta)? –

4

seq - ma disponibile solo su linux.

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

ci sono altre opzioni per seq. Ma le altre soluzioni sono molto belle e più importanti, portatili. Thx

+0

Stranamente funziona in AIX. –

+1

@ C.Ross Sembra che qualcuno abbia installato "seq" nella tua casella AIX. Non viene standard (almeno non sulle caselle 6.1 che uso) – gbtimmon

+0

@gbtimmon Chi lo sa. –

7

su OpenBSD, usa iota:

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

Solo alcuni esempi che uso in AIX perché non c'è nessun operatore gamma o ss, abusando perl invece.

Ecco un ciclo for, utilizzando Perl come seguenti:

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

Questo è simile, ma io preferisco mentre lettura loop sopra per. Nessun backtick o problema con gli spazi.

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

La mia preferita, fare bash come shell globbing, in questo caso permute con perl.

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

Quanto segue funzionerà su AIX/Linux/Solaris ksh.

#!/bin/ksh 

d=100 

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

Opzionalmente se si voleva pad per 5 posti, vale a dire 00100 .. 00199 si potrebbe iniziare con:

#!/bin/ksh 
typeset -Z5 d 

-Scott