Bash 全局选项是否可将脚本中的所有数字设置为十进制?
我刚刚发现了使用前导为0的变量进行算术的问题。我找到了使用以下方法将单个变量设置为十进制的解决方案:Bash 全局选项是否可将脚本中的所有数字设置为十进制?,bash,Bash,我刚刚发现了使用前导为0的变量进行算术的问题。我找到了使用以下方法将单个变量设置为十进制的解决方案: N=016 N=$((10#$N)) # force decimal (base 10) echo $((N + 2)) # result is 18, ok 但我的脚本中有多个变量,它们在运行时可能会或可能不会取前导零。我想知道是否有一个全局选项可以设置为指定脚本中的所有数字都被解释为十进制?或者这样做会不会有一个我可能没有考虑到的潜在问题 我原以为set命令可能有这样一个选项,但在参考手册
N=016
N=$((10#$N)) # force decimal (base 10)
echo $((N + 2))
# result is 18, ok
但我的脚本中有多个变量,它们在运行时可能会或可能不会取前导零。我想知道是否有一个全局选项可以设置为指定脚本中的所有数字都被解释为十进制?或者这样做会不会有一个我可能没有考虑到的潜在问题
我原以为
set
命令可能有这样一个选项,但在参考手册页后,我没有读到任何看起来可以完成此任务的内容。据我所知,这是一个由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
不过,我不知道这是否比你在问题中提出的解决方案更具可读性,或者更不容易出错。如果你所有的初始化都是
VAR=0xxx
,你可以使用sed
去掉前导零:s/=0*/=/g
。这并不是对OP问题的真正回答。他想要的解决方案不需要他将脚本中的每个VAR
更改为该值。@FlorinStingaciu“他想要的解决方案不需要他将脚本中的每个VAR更改为该值。”正如我所说,通过查看bash源代码,这样的选项不存在。OP必须接受这一点——或者以某种方式预处理它的脚本(正如在注释中所建议的那样)。我编辑了答案,以便在bash
计算算术表达式时,添加对负责字符串到长转换的一个函数的引用。约定“前缀0表示八进制”也在那里硬编码。因此,如果没有全局选项,那么最好在设置变量时将其指定为十进制,这样就不需要每次在脚本中调用时都将其指定为十进制或去掉前导零。你认为,还是不认为?@nanker没有看到你的剧本,很难对你的具体情况有一个明确的答案。然而,在一般情况下,我会尽快进行转换/剥离。最好是在读取值之后。