web-dev-qa-db-ja.com

シェルスクリプト "for"ループ構文

私は次のものを動かすようになった。

for i in {2..10}
do
    echo "output: $i"
done

それはoutput: 2output: 3のように多くの行を生成します。

ただし、次を実行しようとしました。

max=10
for i in {2..$max}
do
    echo "$i"
done

以下を生成します。

output: {2..10}

$ maxを文字列の一部ではなく、配列のもう一方の端として扱うようにコンパイラに認識させるにはどうすればよいですか。

169
eykanal

ブレース展開、 {x..y} は他の展開の前に実行されるため、可変長シーケンスには使用できません。

代わりに、 user mob 述べられた としてseq 2 $maxメソッドを使用してください。

だから、あなたの例ではそれはそれだろう:

max=10
for i in `seq 2 $max`
do
    echo "$i"
done
207
whatsisname

算術式バージョンのforを試してください。

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

これはほとんどのバージョンのbashで利用可能で、Bourne Shell(sh)互換でもあるはずです。

66
system PAUSE

ループを手動で実行します。

 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"をエコーし​​ます。完了
27
Nietzche-jou

それには複数の方法があります。

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done
9
ephemient

システムでseqコマンドが使用可能な場合

for i in `seq 2 $max`
do
  echo "output: $i"
done

そうでなければ、貧しい人のseqPerlを使います。

seq=`Perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

それらの引用符を見てください。

8
mob

これは方法です。
Bash:

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

bash -cksh -cまたはzsh -cにそれぞれ置き換えられた場合、上記のBashの方法はkshおよびzshにも有効です。

注:for i in {2..${max}}; do echo $i; donezshおよびkshで機能します。

4
Jahid

Cプログラミングのようにループを繰り返すことができます。

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do 
      echo $i
done
3
rashedcs

ここではMac OS X上で動作しました。

BSD日付の例、日付の増減方法も含まれています。

for ((i=28; i>=6 ; i--));
do
    dat=`date -v-${i}d -j "+%Y%m%d"` 
    echo $dat
done
2
minhas23

システムにseqコマンドがインストールされていないので(Mac OS X v10.6.1(Snow Leopard))、代わりにwhileループを使用しました。

max=5
i=1

while [ $max -gt $i ]
do
    (stuff)
done

* シュラグス *何でもうまくいく。

2
eykanal

これらはすべて{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
1
user4427511

つかいます:

max=10
for i in `eval echo {2..$max}`
do
    echo $i
done

変数置換後に{}を再評価するには、明示的な 'eval'呼び出しが必要です。

1
Chris Dodd