Kshでforループを使用して、単純な範囲の整数を反復処理するにはどうすればよいですか?
たとえば、私のスクリプトは現在これを行っています...
for i in 1 2 3 4 5 6 7
do
#stuff
done
...しかし、7より上の範囲を拡張したいのですが、より良い構文はありますか?
中括弧?
for i in {1..7}
do
#stuff
done
ループ?
while [[ $i -lt 1000 ]] ; do
# stuff
(( i += 1 ))
done
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;
以下は、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
-スコット
seq-Linuxでのみ使用可能です。
for i in `seq 1 10`
do
echo $i
done
seqには他のオプションがあります。しかし、他のソリューションは非常に優れており、より重要で、移植性があります。 THX
範囲演算子や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