On Tue, Nov 03, 2009 at 05:37:45PM -0700, Bob Proulx wrote:
> Dobromir Romankiewicz wrote:
> > bash: 0008: value too great for base (error token is "0008").
> Numbers with leading zeros are read as octal constants. Octal is
> composed of '0' through '7'. The number '8' is too large to be an
> octal number.
>
> $ echo $((0008))
> bash: 0008: value too great for base (error token is "0008")
>
> To have the number read as a decimal number the leading zeros must be
> removed.
>
> $ echo $((8))
> 8
If removing the leading zeroes would be difficult for you, then you can
force the arithmetic expression to use base 10 by prefixing the variable
with "10#". Thus:
month=$(date +%m) # Can produce "08" etc.
next_month=$(( (10#$month == 12) ? 1 : 10#$month+1 ))
echo $next_month
On the other hand, removing a single leading zero is not difficult:
month=$(date +%m) month=${month#0} # Removing leading 0
next_month=$(( ($month == 12) ? 1 : $month+1 ))
Removing multiple leading zeroes, however, requires either a loop, or the
use of extended globs. A variant of this question (removing leading/trailing
spaces) appears at <http://mywiki.wooledge.org/BashFAQ/067>. Although it
looks like someone removed my loop solution... grrr.
> Note also that the use of $[expression] for $((expression)) is
> documented as deprecated and to be removed in a future version.
> Better to use $((expression)) instead.
$((...)) is also POSIX-compliant. Please do switch.