私は最近bashスクリプトを使い始め、0000から9999まで計算されるスクリプトを書いてみました。かなり簡単な作業だと思いました。それからbashは0007を8進数として扱い、0009エラーを引き起こす問題に直面しました。 base10を使って解決策を見つけましたが、うまくいきません。私は何が間違っていましたか?問題のコードは次のとおりです。
guess=0000
for guess in $(seq -f "%04g" 0000 9999)
do
echo $((10#guess))
guess=$((10#guess+1))
done
答え1
変数拡張としてマークするために、$
変数名の前に()を逃しました。$guess
for guess in $(seq -f "%04g" 0000 9999)
do
echo $((10#$guess))
guess=$((10#$guess+1))
done
そうしないと、算術拡張がその値ではなく文字通り$(())
評価され、guess
値が下数に比べて大きすぎるというエラーが発生します。
答え2
ループは少し重複して印刷されたすべての値にfor
設定されるため、値を直接変更する必要はありません。guess
seq
for guess in $(seq -f "%04g" 0000 9999) ;do
guess=$((10#guess+1))
done
実際、for
ループは次のものと比較してユーザーが行った割り当てをほとんど扱います。
$ for x in 9 6 3 ; do echo $x; x=1 ; done
9
6
3
(割り当てられた値は1
印刷されません。)
したがって、次のようになります。
$ for x in $(seq -f "%04g" 1 2) ; do echo $x; done
0001
0002
または、printf
次の方法を使用して目的の形式の数値を取得できます。
$ for x in $(seq 1 2) ; do printf "%04d\n" $x; done
0001
0002
私の考えでは、一部のシステムにはそのような機能がないので、seq
必要ありません。 Bashでは、次のように動作します。
$ for (( x=0 ; x < 100 ; x++ )) ; do
printf "%04d\n" $x
done