6

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
750

instead

$ (( 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?

12
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

  • 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
  • 3
    +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
  • 1
    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
5

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)).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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