Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a simple script that deals with hours and minutes.

If I want to calculate number of minutes since midnight having a string s hh:mm I tried splitting string then doing hh * 60 + mm

My problem is, while

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


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

As far as I understand string 09 is not to be intended as a base 10 number.

Is there a better way than simply removing leading zeros in string?

share|improve this question
up vote 10 down vote accepted
h=09; m=30;(( tot = 10#$h * 60 + 10#$m )); echo $tot  

The number before the # is the radix (or base)
The number after the # must be valid for the radix
The output is always decimal
You can use a radix of 2 thru 64 (in GNU bash 4.1.5)

As noted by enzoyib, the old alternative of $[expression] is depricated, so it is beter to use the POSIX compliant $((expr))

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

I'm not sure which 'digits' are used after Z

share|improve this answer
what about a litte more information about $[10#09] ??? – neurino Aug 24 '11 at 8:53
I enclosed it in hh extraction: hh=$[10#${hhmm%:*}] the hell of readability! :D Thanks for the quick answer! – neurino Aug 24 '11 at 9:07
+1, but from bash's manual page: "The old format $[expression] is deprecated and will be removed in upcoming versions of bash.". Better to use $((expr)) that is POSIX compliant. – enzotib Aug 24 '11 at 11:01
The ksh and bash manpages describe the digits for bases higher than 36: 0-9, a-z, A-Z, @, _ (bases 36 and lower are case insensitive). – Chris Johnsen Aug 25 '11 at 6:35

A leading zero on a numeric constant in shell arithmetic expressions denotes an octal constant.

Here's a portable way of deleting initial zeros:

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

In bash, ksh or zsh, you can explicitly specify base 10 with $((10#$h)).

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.