web-dev-qa-db-ja.com

kshのintの範囲を反復処理しますか?

Kshでforループを使用して、単純な範囲の整数を反復処理するにはどうすればよいですか?

たとえば、私のスクリプトは現在これを行っています...

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

...しかし、7より上の範囲を拡張したいのですが、より良い構文はありますか?

23
razlebe

中括弧?

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

ループ?

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

ksh9、BashとzshはすべてCのようなforループ構文を理解します:

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

残念ながら、kshとzshは定数と変数を使用した中括弧の構文を理解しますが、Bashは定数(Bash 4を含む)のみを処理します。

openBSDでは、jotを使用します。

for i in `jot 10`; do echo $i ; done;
9
Colin

以下は、AIX/Linux/Solaris kshで動作します。

#!/bin/ksh

d=100

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

オプションで、5つの場所、つまり00100 .. 00199までパディングする場合は、次のように開始できます。

#!/bin/ksh
typeset -Z5 d

-スコット

5
scott--

seq-Linuxでのみ使用可能です。

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

seqには他のオプションがあります。しかし、他のソリューションは非常に優れており、より重要で、移植性があります。 THX

4
cheko

範囲演算子やseqがなく、代わりにPerlを悪用しているため、AIXで使用するいくつかの例にすぎません。

これは、seqのようなPerlを使用したforループです。

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

これは似ていますが、読み取りループはforループよりも優先されます。バッククォートやスペースの問題はありません。

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

私のお気に入りは、bashのようなシェルグロビングを実行することです。この場合は、Perlを使用します。

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