(십진수) 변수(앞에 0이 붙음)의 값을 +1씩 늘리는 방법은 무엇입니까?

(십진수) 변수(앞에 0이 붙음)의 값을 +1씩 늘리는 방법은 무엇입니까?

내용 값이 있는 Build.number라는 파일이 있습니다.012+1씩 늘려야 합니다. 그래서 나는 이것을 시도했다.

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

하지만 내가 예상했을 때 내가 얻는 값은 11입니다.013. 누가 날 도울 수 있죠?

답변1

선행 0은 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

와 동일 ksh93, BN=011; echo "$(($BN))"출력 9하지만 echo "$((BN))"11을 출력합니다.

숫자가 로 시작하지 않거나 작동하는 한 를 bash사용할 수 있습니다 .BN=$((10#$(<Build.number)))-+

답변3

${var#prefix}POSIX 셸에서는 및 확장 형식의 조합을 사용하여 숫자에서 선행 0을 제거하여 숫자가 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

이는 bash, zshksh93에 적용됩니다 mksh.yash

bash, ksh93및 ( 및 zsh에서는 제외 ) 에서는 forranish 연산자(지수)를 사용할 수도 있습니다 .yashmksh**

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

답변4

숫자열을 증가시키는 함수입니다. 선행 0을 관찰하고 비트 수를 보존하려고 시도합니다. 변수를 사용하지 않으므로 로컬 변수를 선언하기 위해 셸 확장이 필요하지 않으며 변수 네임스페이스를 오염시키지 않습니다.

# $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

관련 정보