#!/bin/bash
myfirstarray=(1 3 5 7 9 11)
for i in {2..4}
do
for j in {1..${myfirstarray[$((i-1))]}}
do
echo ${j}
done
done
上記のコードでは、外部ループの範囲は必要に応じて解釈され、からまで2
繰り返されます4
。内部ループ範囲内の両方の置換も有効です。ただし、内部範囲は整数範囲ではなく文字列として解釈されます。この問題をどのように解決できますか?
期待される:
1
2
3
1
2
3
4
5
1
2
3
4
5
6
7
結果:
{1..3}
{1..5}
{1..7}
答え1
Bashでは、中かっこ拡張は他の拡張よりも先に実行されるため、その中で拡張を使用することはできません。これはここで最も一般的な質問の1つです。
zsh
問題を解決するために(どこ{x..y}
から来たのか)またはksh93
他のシェルを使用することができますが、通常はループで中括弧拡張を使用したくありyash -o braceexpand
ません。これは、たとえば、数値リスト全体をメモリに複数回保存することに関連しているためです。それを使うのと同じくらい悪いです。for
for i in {1..1000000}
for i in $(seq 1000000)
ksh93のCと同様のループを使用することをお勧めします。
#! /bin/bash -
myfirstarray=(1 3 5 7 9 11)
for (( i = 2; i <= 4; i++ )); do
for (( j = 1; j <= myfirstarray[i-1]; j++ )); do
echo "$j"
done
done
コードからわからない分割+glob呼び出しも削除しました。
zshに切り替えると、他の利点もあります。たとえば、上記のコードは次のようになります。
#! /bin/zsh -
myfirstarray=(1 3 5 7 9 11)
for i ({2..4}) for j ({1..$myfirstarray[i]}) echo $j
または:
#! /bin/zsh -
myfirstarray=(1 3 5 7 9 11)
for i ($myfirstarray[2,4]) for j ({1..$i}) echo $j