Bash "이중 대괄호" 산술 확장을 사용하면 앞에 0이 있으면 수학이 실패합니다.

Bash "이중 대괄호" 산술 확장을 사용하면 앞에 0이 있으면 수학이 실패합니다.

시간과 분을 처리하는 간단한 스크립트가 있습니다.

문자열 s를 사용하여 자정 이후의 분 수를 계산하려면 hh:mm문자열을 분할한 다음 다음을 수행합니다.hh * 60 + mm

내 질문은 그런데

$ (( tot = 12 * 60 + 30 ))
$ echo $tot
750

대신에

$ (( tot = 09 * 60 + 30 ))
bash: ((: tot = 09: value too great for base (error token is "09")

내가 이해하는 한, 문자열은 0910진수 숫자가 아닙니다.

단순히 문자열에서 선행 0을 제거하는 것보다 더 좋은 방법이 있습니까?

답변1

h=09; m=30;(( tot = 10#$h * 60 + 10#$m )); echo $tot  

앞의 숫자 #는 기수(또는 기수)입니다.
다음 숫자는 #기수에 유효해야 합니다.
출력은 항상 10진수입니다.
다음 기수를 사용할 수 있습니다2~64(GNU bash 4.1.5에서)

Bash에는 앞에 빼기 기호가 필요하므로 10#숫자에 빼기 기호가 있는 경우 10#접두사를 직접 추가하면 작동하지 않습니다.

지적한대로은조이부, 이전 대안은 $[expression]더 이상 사용되지 않으므로 POSIX 호환을 사용하는 것이 좋습니다$((expr))

$(( 2#1)) ==  1
$((16#F)) == 15
$((36#Z)) == 35  

나중에 어떤 "숫자"가 사용되었는지 잘 모르겠습니다.Z

답변2

쉘 산술 표현식에서 숫자 상수의 앞에 오는 0은 8진수 상수를 나타냅니다.

초기 0을 제거하는 이식 가능한 방법은 다음과 같습니다.

h=${h#${h%%[!0]*}}; [ -n "$h" ] || h=0

Bash, ksh 또는 zsh에서는 다음을 수행할 수 있습니다.베이스 10을 명시적으로 지정그리고 $((10#$h)).

관련 정보