Bash - 最後の1つが変数の場合、範囲はもはや必要に応じて機能しません。

Bash - 最後の1つが変数の場合、範囲はもはや必要に応じて機能しません。
#!/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ません。これは、たとえば、数値リスト全体をメモリに複数回保存することに関連しているためです。それを使うのと同じくらい悪いです。forfor 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

関連情報