2010-01-20 13 views
8

Voglio scrivere un ciclo nella shell Bourne che itera uno specifico insieme di numeri. Normalmente avrei usato seq:Bourne Shell For i in (seq)

for i in `seq 1 10 15 20` 
    #do stuff 
loop 

Ma apparentemente su questa casella di Solaris seq non esiste. Qualcuno può aiutare fornendo un'altra soluzione per iterare una lista di numeri?

risposta

10

provare

for i in 1 10 15 20 
do 
    echo "do something with $i" 
done 

altrimenti se si dispone di recente Solaris, v'è bash 3 almeno. per esempio, questo indica intervallo da 1 a 10 e da 15 a 20

for i in {1..10} {15..20} 
do 
    echo "$i" 
done 

o usare strumento come nawk

for i in `nawk 'BEGIN{ for(i=1;i<=10;i++) print i}'` 
do 
    echo $i 
done 

o anche il ciclo while

while [ "$s" -lt 10 ]; do s=`echo $s+1|bc`; echo $s; done 
+0

Grazie Santo, non so perché l'ho fatto, non provare tale diritto fuori! –

+0

Si potrebbe voler usare 'expr $ s + 1' invece di' echo $ s + 1 | bc'. L'utilità 'expr' è pensata per questo genere di cose. Ovviamente con 'ksh' o' bash' puoi semplicemente usare l'aritmetica della shell. –

+0

e così via. per non parlare di bc fa molto di più di expr. comunque per il promemoria. – ghostdog74

0

ho trovato che questo funziona, anche se brutto come il peccato:

for i in `echo X \n Y \n Z ` ... 
2

È possibile emulare seq con dc:

Ad esempio:

seq 0 5 120 

viene riscritta come:

dc -e '0 5 120 1+stsisb[pli+dlt>a]salblax' 
+1

+1 per la creatività, questo-> nawk 'BEGIN {per (i = 0; i <= 120; i + = 5) print i}' fa lo stesso e più leggibile – ghostdog74

+0

Ho provato ad usare basic strumenti, dal momento che OP menziona bourne shell. Ma non pensavo a "awk". – mouviciel

1

Un'altra variazione usando bc:

for i in $(echo "for (i=0;i<=3;i++) i"|bc); do echo "$i"; done 

Per la shell Bourne, probabilmente dovrai usare b ackticks, ma evitarle se potete:

for i in `echo "for (i=0;i<=3;i++) i"|bc`; do echo "$i"; done 
-3
for i in `seq 1 5 20`; do echo $i; done 

Risultato:

5 
10 
15 
20 

$ man seguenti

SEQ(1)       User Commands       SEQ(1) 

NAME 
     seq - print a sequence of numbers 

SYNOPSIS 
     seq [OPTION]... LAST 
     seq [OPTION]... FIRST LAST 
     seq [OPTION]... FIRST INCREMENT LAST 
+2

Nella domanda dice che 'seq' non è installato e chiede un metodo alternativo. – andrewsi