2009-10-19 11 views
19

Jak mogę iterować przez prosty zakres intów używając pętli for w ksh?Iterowanie przez zakres intów w ksh?

Na przykład mój skrypt obecnie robi to ...

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

... ale chciałbym, aby rozszerzyć zakres droga powyżej 7. Czy istnieje lepsza składnia?

Odpowiedz

36

Nawiasy klamrowe?

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

Bingo - dziękuję! – razlebe

+1

Zobacz także http://stackoverflow.com/questions/169511/how-do-i-iterate-over-overrange- of-numbers-in-bash –

+6

Zależy od wersji ksh, nie działa w systemie AIX . – Demosthenex

15

Podczas gdy pętla?

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

Dzięki - że zrobiłbym ładnie, ale jest tam nie ma żadnej innej składni pętli? – razlebe

+0

+1 dla alternatywnej sugestii – razlebe

+2

Tylko ten jeden opracowany ze wszystkich wersji próbowałem. Jestem w UNIX używając ksh. 182, podczas gdy [[$ i -lt 1000]]; do i = $ (($ i + 1)) echo "asdf $ i" zrobione 183 historia – mathtick

10

ksh93, atakujących i zsh wszystkim rozumieć C jak składni for pętli:

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

Niestety, podczas KSH i zsh zrozumieć nawiasem zakres składnia stałych i zmiennych Basha obsługuje tylko stałe (w tym Bash 4).

+1

Nie działa w systemie AIX. To nie jest poprawne we wszystkich wersjach KSH – Katerberg

+0

sbtorsvr391: ~/temp/pipes $ ksh $ for ((i = 1; i <= 9; i ++)) ksh: błąd składniowy: '(('nieoczekiwany $ – mathtick

+0

@mathtick: Czy używasz ksh93 (jak podano w mojej odpowiedzi)? –

4

seq - ale dostępne tylko w systemie Linux.

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

Dostępne są inne opcje dla seq. Ale inne rozwiązania są bardzo ładne i ważniejsze, przenośne. Thx

+0

Dziwne, to działa w systemie AIX. –

+1

@ C.Ross Wygląda na to, że ktoś zainstalował "seq" w twoim AIX-ie. Nie jest standardem (przynajmniej nie na pudełkach 6.1, których używam). – gbtimmon

+0

@ gbtimmon Kto wie. –

7

na OpenBSD, użyj jot:

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

tylko kilka przykładów używam w systemie AIX, ponieważ operator nie ma zasięgu lub nast, nadużywanie Perl zamiast.

Oto do pętli przy użyciu Perl jak SEQ:

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

ten jest podobny, ale wolę podczas odczytu pętle nad dla. Brak backticków lub problemów ze spacjami.

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

Moja ulubiona, jak zrobić bash-shell masek, w tym przypadku permutacji z Perl.

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

Poniższe czynności będą działać w systemie AIX/Linux/Solaris ksh.

#!/bin/ksh 

d=100 

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

Ewentualnie jeśli chciał pad do 5 miejsc, czyli 00100 .. 00199 można zacząć:

#!/bin/ksh 
typeset -Z5 d 

-Scott

Powiązane problemy