시간과 분을 처리하는 간단한 스크립트가 있습니다.
문자열 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")
내가 이해하는 한, 문자열은 09
10진수 숫자가 아닙니다.
단순히 문자열에서 선행 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))
.