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 this:

date +"%H hours and %M minutes"

I use festival to say it up.. but it says like: "zero nine hours".. I want it to say "nine hours"!

but date always give me 09... so I wonder if bash can easly make that become just 9?

in the complex script I tried like

printf %d 09

but it fails.. not octal :(

any idea?

share|improve this question
up vote 23 down vote accepted
  • In your case, you can simply disable zero padding by append - after % in the format string of date: %-H

    By default, date pads numeric fields with zeroes. The following optional flags may follow '%':

    • - (hyphen) do not pad the field
    • _ (underscore) pad with spaces
    • 0 (zero) pad with zeros
    • ^ use upper case if possible
    • # use opposite case if possible

    See date manual

  • If you want to interpret number in different base, in bash

    • Constants with a leading 0 are interpreted as octal numbers.
    • A leading 0x or 0X denotes hexadecimal.
    • Otherwise, numbers take the form [base#]n, where base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base

    So, to interpret a number as decimal, use 10#n form, eg. 10#09

    echo $((10#09*2))

    See Arithmetic Evaluation section of bash manual.

share|improve this answer
thx, very detailed! btw, echo $((011)) $((10#011)) is another good example that outputs 9 11 – Aquarius Power Apr 29 '13 at 21:10
This does not work for negative numbers: lat=048 ; latd=${lat#0} ; echo $((latd-1)) works, but lat=-048 ; latd=${lat#0} ; echo $((latd-1)) doesn't. – Luis A. Florit Feb 12 at 0:17

In general in bash:

test ${#number} -eq 2 && number=${number#0}

resulting in

date +"%H %M" | 
{ read hours minutes
echo "${hours} hours and ${minutes} minutes"; }

Or, different:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

I am surprised that date does not have appropriate format options.

share|improve this answer

If you're trying to do comparisons in decimal with date values, I've found this method to be very effective:

let mymin=$(date '+1%M') ; let mymin=$mymin%100

That always yields a decimal value. So I can do this:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

There's no problem with 08 or 09 this way. Using %10 instead of %100 gives you ten-minute ranges from 0 through 9. I also find the following gives decimal values, without leading zeros:

echo "$((10#$(date +%M)))"
share|improve this answer

Portably, you can easily remove a leading 0 from a variable. This leaves the variable unchanged if there is no leading 0.

eval $(date +"h=%H m=%M")
say "$h hours and $m minutes"

In bash, ksh or zsh, you can use ksh's additional glob patterns to remove any number of leading 0s. In bash, run shopt -s kshglob first. In zsh, run setopt ksh_glob first.

eval $(date +"h=%H m=%M")
say "$h hours and $m minutes"
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.