/bin/sh arithmetic doesn't seem to like leading 0 now
Jilles Tjoelker
jilles at stack.nl
Fri Sep 21 17:34:10 UTC 2012
On Fri, Sep 21, 2012 at 10:09:02AM -0700, David Wolfskill wrote:
> I have a construct in a shell script that I had been using under
> stable/8 (most recently, @r240259), but which throws an error under
> stable/9 (at least as early as @r238602):
> $ echo $(( ( $( date +%m ) - 1 ) / 3 + 1 ))
> 3
> $ uname -r
> 8.3-PRERELEASE
> $ echo $(( ( $( date +%m ) - 1 ) / 3 + 1 ))
> arithmetic expression: expecting ')': " ( 09 - 1 ) / 3 + 1 "
> $ uname -r
> 9.1-PRERELEASE
> Trying bits & pieces of the above, I narrowed the issue down to:
> $ echo $(( 09 + 0 ))
> arithmetic expression: expecting EOF: " 09 + 0 "
> while
> $ echo $(( 9 + 0 ))
> 9
> $
> is not a problem.
> Is this intentional?
Yes, it was changed with r216547, December 2010.
This was done to avoid an inconsistency where constants starting with
"0" and containing "8" or "9" were decimal, so something like
$((018-017)) expanded to 3.
There are indeed various cases where this inconsistency does not matter
(because the numbers with leading zeroes do not exceed 10).
> (I can work around it -- e.g., by using sed to strip leading 0 from the
> month number (since strftime() doesn't appear to have a format that
> provides the value in a form that lacks the leading zero for values <
> 10). But I'd rather not do that if I don't need to.)
You can use date +%-m although it is not in POSIX.
With POSIX only, it is still possible to do it reasonably efficiently,
for example $(( 1$(date +%m) - 100 )) or v=$(date +%m); v=${v#0}.
--
Jilles Tjoelker
More information about the freebsd-stable
mailing list