(10進数)変数(前に0が付く)の値を+ 1ずつ増やす方法は?

(10進数)変数(前に0が付く)の値を+ 1ずつ増やす方法は?

コンテンツ値を持つBuild.numberというファイルがあります。012+1ずつ増やす必要があります。だから私はこれを試しました。

BN=$($cat Build.number)
BN=$(($BN+1))
echo $BN >Build.number

しかし、私が期待したときに得られる値は11です。013。誰が私を助けることができますか?

答え1

先行ゼロはBashを引き起こします。値を8進数値として解釈する;8進数012は10進数10なので11になります。

小数点以下の桁数を強制するには、以下を追加します10#(数字の前に符号がない場合)。

BN=10#$(cat Build.number)
echo $((++BN)) > Build.number

3桁以上の数字で印刷するには、次のようにしますprintf

printf "%.3d\n" $((++BN)) > Build.number

答え2

bash08進数で始まる定数は、算術式で8進数として扱われ、011実際にはそうです9

これは実際にはPOSIXの要件です。

他のいくつかのシェルは有用なものよりも多くの干渉を引き起こすので、これを好むmkshか無視します(POSIX互換モードを除く)。zsh

と同じksh93BN=011; echo "$(($BN))"出力9echo "$((BN))"11を出力します。

数字がで始まらない場合、または機能している限りbash使用できます。BN=$((10#$(<Build.number)))-+

答え3

${var#prefix}POSIXシェルでは、拡張形式の組み合わせを使用して数字から先行ゼロを削除することで、数字が8進数で処理されるのを防ぎます${var%%suffix}

BN=001002; BN=$(( ${BN#${BN%%[!0]*}} + 1 )); echo "$BN"
1003

${var//pat/repl}この構文をサポートするシェルでは、前にaを追加して減算することもできます。110^{number_of_digits}

BN=000012; BN=$(( 1$BN - 1${BN//?/0} )); echo "$BN"; BN=$((BN+1)); echo "$BN"
12
13

これはbashzshおよびksh93に適用されますmkshyash

bash、 およびksh93zshおよび除く)では、forranish演算子(指数)を使用することもできます。yashmksh**

BN=000012; BN=$(( 1$BN - 10**${#BN} ))

答え4

数値列を増やす関数です。先行ゼロを観察し、ビット数を保存しようとします。変数を使用しないため、ローカル変数を宣言するためにシェル拡張は必要なく、変数名前空間を汚染しません。

# $1 -- decimal string, possibly with leading zeros or sign
# $2 -- integer increment, no leading zeros.
incnumstr()
{
  if [ $1 -lt 0 ] ; then
    set -- $(incnumstr ${1#-} $((- $2)))
    [ $1 -le 0 ] && printf "%s" ${1#-}  \
                 || printf "%s" -$1
    return
  fi

  set -- ${1#-} $2 # strip leading minus from zero

  [ $1 -eq 0 ] && printf "%s%0.*d" "$3" ${#1} $2 \
               || printf "%s%0.*d" "$3" ${#1} $(( ${1#${1%%[1-9]*}} + $2 ))
}

インタラクティブテスト:

$ echo $(incnumstr 0 0)
0
$ echo $(incnumstr -0 0)
0
$ echo $(incnumstr 0 1)
1
$ echo $(incnumstr 0 -1)
-1
$ echo $(incnumstr 00 1)
01
$ echo $(incnumstr 00 -1)
-01
$ echo $(incnumstr -10 10)
00
$ echo $(incnumstr -10 11)
01
$ echo $(incnumstr -10 20)
10
$ echo $(incnumstr -10 99)
89
$ echo $(incnumstr -10 110)
100
$ echo $(incnumstr 100 -90)
010
$ echo $(incnumstr 100 -99)
001
$ echo $(incnumstr 100 -100)
000
$ echo $(incnumstr 100 -101)
-001
$ echo $(incnumstr 100 -1234)
-1134
$ echo $(incnumstr -0000 0)
0000
$ echo $(incnumstr -0000 1)
0001
$ echo $(incnumstr -0000 -2)
-0002

関連情報