base10が機能しない

base10が機能しない

私は最近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設定されるため、値を直接変更する必要はありません。guessseq

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

関連情報