[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: printf has weird behaviour when parsing zero padded numbers
From: |
Chris F.A. Johnson |
Subject: |
Re: printf has weird behaviour when parsing zero padded numbers |
Date: |
Mon, 22 Jun 2009 18:51:54 -0400 (EDT) |
User-agent: |
Alpine 2.00 (LMD 1167 2008-08-23) |
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)