How do I remove leading zeroes from output of 'date' or avoid octal interpretation of such decimal numbers?
Solution 1
-
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)) 18
See Arithmetic Evaluation section of bash manual.
Solution 2
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")
h=${h#0}
m=${m#0}
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 0
s. In bash, run shopt -s extglob
first. In zsh, run setopt kshglob
first.
eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"
Solution 3
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)))"
Solution 4
In general in bash:
test ${#number} -eq 2 && number=${number#0}
resulting in
date +"%H %M" |
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
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.
Related videos on Youtube
Aquarius Power
"truth is a pathless land" - read Jiddu Krishnamurti
Updated on September 18, 2022Comments
-
Aquarius Power almost 2 years
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?
-
Luis A. Florit over 8 yearsThis does not work for negative numbers:
lat=048 ; latd=${lat#0} ; echo $((latd-1))
works, butlat=-048 ; latd=${lat#0} ; echo $((latd-1))
doesn't. -
DrBeco over 7 years
plus=$((10#01))