[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