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