我刚刚发现使用领先0的vars进行算术运算的问题。我找到了使用以下方法将单个变量设置为十进制的解决方案:
N=016
N=$((10#$N)) # force decimal (base 10)
echo $((N + 2))
# result is 18, ok
但是我的脚本中有多个vars,在运行时可能会也可能不会获得前导零。我想知道是否有一个全局选项可以设置为指定脚本中的所有数字都被解释为十进制?或者这样做是否存在潜在问题,以至于我可能没有考虑到这一点?
我认为set
命令可能有这样的选项,但在参考了手册页之后,我没有看到任何看起来像它可以完成任务的内容。
答案 0 :(得分:3)
据我所知,这是由B语言建立的(不幸)约定,而不是领先的0
引入八进制数。
通过查看bash
来源,似乎此约定在几个地方(lib/sh/strtol.c
,builtins/common.c
进行了硬编码,并且涉及expr.c
中的特定情况,函数strlong
)。 所以为了回答你的问题,没有全球选项将所有数字设置为十进制。
如果基数10中的数字可能以0
为前缀,您想要执行计算,则可以使用${N#0}
表示法来引用它们。
sh$ N=010
sh$ echo $((${N#0}+0))
10
我不知道这是否比您在问题中提出的解决方案更容易可读,甚至更少易错_ 。