On Fri, Jun 19, 2009 at 11:05:27AM -0700, bitozoid wrote:
> >         edua...@ceo ~ $ printf "%02d\n" 00008
> >         -bash: printf: 00008: invalid number

> Sorry, not a bug, but octal representation. Really sorry.

Others will make the same mistake (it's very common), so for the
benefit of people searching for answers, here are the two workarounds
I know:

1) Strip all leading zeroes from strings that you intend to use as numbers
   before you use them.

2) Force interpretation of the string as a base 10 number by prefixing it
   with 10# inside a numeric context.

Number 1 is trickier than it seems at first glance.  There are two ways
(that I know) to do it:

 a) Use extended glob notation to remove multiple leading zeroes in a
    single regular expression:

    shopt -s extglob
    n=${n##+(0)}

 b) Use a loop to remove all leading zeroes, one at a time:

    while [[ $n = 0* ]]; do n=${n#0}; done

Number 2 is usually simpler in practice:

    x=$((10#$n + 1))   # and so on


Reply via email to