|
From: | Ilkka Virta |
Subject: | Re: Number with sign is read as octal despite a leading 10# |
Date: | Tue, 10 Jul 2018 14:14:39 +0300 |
User-agent: | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Thunderbird/52.9.0 |
For what it's worth, ksh and zsh seem to interpret 10#-0159 as negative one-hundred and fifty-nine: $ ksh -c 'for a do a="10#$a"; printf "%s " $((a + 1)); done; echo' \ sh +159 +0159 -159 -0159 160 160 -158 -158 $ zsh -c 'for a do a="10#$a"; printf "%s " $((a + 1)); done; echo' \ sh +159 +0159 -159 -0159 160 160 -158 -158 $ ksh --version version sh (AT&T Research) 93u+ 2012-08-01 $ zsh --version zsh 5.3.1 (x86_64-debian-linux-gnu) On 10.7. 13:44, Ilkka Virta wrote:
I think the problematic case here is when the number comes as input from some program, which might or might not print a leading sign or leading zeroes, but when we know that the number is, in any case, decimal.E.g. 'date' prints leading zeroes, which is easy enough to handle: hour=$(date +%H) hour=${hour#0} # remove one leading zero, or hour="10#$hour" # make it base-10The latter works even with more than one leading zero, but neither works with a sign. So, handling numbers like '-00159' gets a bit annoying:$ num='-00159' $ num="${num:0:1}10#${num:1}"; echo $(( num + 1 )) -158 And that's without checking that the sign was there in the first place.Something like that will probably not be too common, but an easier way to force any number to be interpreted in base-10 (regardless of leading zeroes) could be useful. If there is a way, I'd be happy to hear.On 10.7. 04:37, Clint Hepner wrote:The + is a unary operator, not part of the literal. Write $((+10#0034)) instead.-- ClintOn Jul 9, 2018, 9:24 PM -0400, Isaac Marcos <isaacmarcos100010@gmail.com>, wrote:Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' -DCONF_VENDOR uname output: Linux IO 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu Bash Version: 4.4 Patch Level: 12 Release Status: release Description:A value inside an arithmetic expansion is processed as octal despite usinga 10# preffix. Repeat-By: $ echo $((10#+0034)) 28 Fix: Extract optional sign before parsing the number, re-attach after. -- Cases are always threesome: Best case, Worst case, and Just in case
-- Ilkka Virta / itvirta@iki.fi
[Prev in Thread] | Current Thread | [Next in Thread] |