forループに変数を入れる方法は? [コピー]

forループに変数を入れる方法は? [コピー]
for seq in {046725..046899}
do
   #body
done

上記のコードは、先行ゼロを維持しながら正常に実行されます。注文変数ですが、下のスニペットが実行されないのはなぜですか?解決策は何ですか?しなければならない 注文先行ゼロがある場合、forループの変数には先行ゼロがあります。

lowest=046725
highest=046899
for seq in {$lowest..$highest}
do
  #body
done

答え1

「Brace 拡張は他の拡張の前に実行されます」 - bash マニュアルで。次は変数拡張です。

答え2

これを行うには、次のコードを使用できる必要があります。

#!/bin/bash

lowest=046725
highest=046899
width=6

for (( seq=10#$lowest; seq<=10#$highest; seq++))
  do

    length=`echo -n $seq | wc -c`

    if [[ $length < $width ]]; then

      number_of_zeroes_to_add=`expr $width - $length`

      for zeroes in `seq $number_of_zeroes_to_add`;
        do echo -n 0;
      done

    fi

    echo $seq


done

これは、数字の幅(6文字の幅など)を決定し、この幅に合わない数字(前のゼロが切り捨てられたため)を識別して再挿入することです。

答え3

中かっこ拡張は{...}パラメータ拡張よりはるかに先です${..}

中括弧拡張を実行するために行を再処理し、$ var内の値を取得する1つの方法は、次のものを使用することですeval(この場合は推奨されず、実際には必要ありません)。

lowest=046725
highest=046899
for for seq in $(eval echo {$lowest..$highest});
do
    #body
done

制限された数字の前にゼロがない場合は良いですが、そうであれば数字も変換されます。

要求時に出力には前にゼロが付きます。単一のエンティティによって制御されますprintf。 2つのゼロが必要な場合06に変更します。07

#!/bin/bash

lowest=046725              highest=046899

seq="$(( 10#$lowest ))"    max="$(( 10#$highest ))"

while    (( seq <= max ))
do       printf '%06d\n' $(( seq++ ))
done

変数に結果が必要な場合は、次の行を使用してvarを使用してください。

do       printf -v var '%06d\n' $(( seq++ ))

まだ一つあります。shバージョン:

#!/bin/sh

lowest=00046725    highest=000046899

seq=${lowest#"${lowest%%[!0]*}"}
max=${highest#"${highest%%[!0]*}"}

while    [ $seq -le $max ]
do       printf '%06d ' "$seq"
         seq=$(( seq + 1 ))
done

関連情報