[prev in list] [next in list] [prev in thread] [next in thread] 

List:       bash-bug
Subject:    Re: printf has weird behaviour when parsing zero padded numbers
From:       "Chris F.A. Johnson" <cfaj () freeshell ! org>
Date:       2009-06-22 22:51:54
Message-ID: alpine.LMD.2.00.0906221851040.3952 () doublethink
[Download RAW message or body]

On Mon, 22 Jun 2009, Greg Wooledge wrote:

> On Fri, Jun 19, 2009 at 11:05:27AM -0700, bitozoid wrote:
> > >         eduardo@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)}

   Or, with standard globbing:

${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


-- 
   Chris F.A. Johnson, webmaster         <http://woodbine-gerrard.com>
   ===================================================================
   Author:
   Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress)



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic