私は次のものを動かすようになった。
for i in {2..10}
do
echo "output: $i"
done
それはoutput: 2
、output: 3
のように多くの行を生成します。
ただし、次を実行しようとしました。
max=10
for i in {2..$max}
do
echo "$i"
done
以下を生成します。
output: {2..10}
$ maxを文字列の一部ではなく、配列のもう一方の端として扱うようにコンパイラに認識させるにはどうすればよいですか。
ブレース展開、 {x..y} は他の展開の前に実行されるため、可変長シーケンスには使用できません。
代わりに、 user mob 述べられた としてseq 2 $max
メソッドを使用してください。
だから、あなたの例ではそれはそれだろう:
max=10
for i in `seq 2 $max`
do
echo "$i"
done
算術式バージョンのfor
を試してください。
max=10
for (( i=2; i <= $max; ++i ))
do
echo "$i"
done
これはほとんどのバージョンのbashで利用可能で、Bourne Shell(sh)互換でもあるはずです。
ループを手動で実行します。
i = 0 max = 10 [ ] echo [output:$ i "[。 true $((i ++)) 完了
完全にPOSIXになる必要がない場合は、 for という算術演算を使用できます。
[(____)max = 10 ((i = 0; i <max; i ++)); "output:$ i"をエコーします。完了
またはBSDシステムで jot (1)を使用します。
$の中のi(jot 0 10)。 "output:$ i"をエコーします。完了
それには複数の方法があります。
max=10
for i in `eval "echo {2..$max}"`
do
echo "$i"
done
システムでseq
コマンドが使用可能な場合
for i in `seq 2 $max`
do
echo "output: $i"
done
そうでなければ、貧しい人のseq
とPerl
を使います。
seq=`Perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
echo "output: $i"
done
それらの引用符を見てください。
これは方法です。
Bash:
max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done
bash -c
がksh -c
またはzsh -c
にそれぞれ置き換えられた場合、上記のBashの方法はksh
およびzsh
にも有効です。
注:for i in {2..${max}}; do echo $i; done
はzsh
およびksh
で機能します。
Cプログラミングのようにループを繰り返すことができます。
#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
echo $i
done
ここではMac OS X上で動作しました。
BSD日付の例、日付の増減方法も含まれています。
for ((i=28; i>=6 ; i--));
do
dat=`date -v-${i}d -j "+%Y%m%d"`
echo $dat
done
システムにseq
コマンドがインストールされていないので(Mac OS X v10.6.1(Snow Leopard))、代わりにwhile
ループを使用しました。
max=5
i=1
while [ $max -gt $i ]
do
(stuff)
done
* シュラグス *何でもうまくいく。
これらはすべて{1..8}
を行い、すべてPOSIXであるべきです。ループに条件付きのcontinue
を入れてもそれらは壊れません。標準的な方法:
f=
while [ $((f+=1)) -le 8 ]
do
echo $f
done
別の方法:
g=
while
g=${g}1
[ ${#g} -le 8 ]
do
echo ${#g}
done
そしてもう一つ:
set --
while
set $* .
[ ${#} -le 8 ]
do
echo ${#}
done
つかいます:
max=10
for i in `eval echo {2..$max}`
do
echo $i
done
変数置換後に{}を再評価するには、明示的な 'eval'呼び出しが必要です。