【问题标题】:How to do treat octal numbers as decimal when doing arithmetics under busybox' ash在busybox'ash下进行算术运算时如何将八进制数视为十进制
【发布时间】:2013-05-13 12:55:18
【问题描述】:

我有十进制数字存储在字符串中。

"045"或"005"这种方式存储。

在像let A="045"+"009" 这样的算术运算中使用这些数字字符串时,这些数字被视为八进制数,如手册页中所示。

为了将它们视为十进制,我在数字字符串的开头添加了10#

let A="10#045"+"10#123"

但是这个解决方案会在我的 BusyBox(安装在 OpenWRT 上)的 bash 中导致错误 -ash: let: arithmetic syntax error

我的busybox shell还有其他解决方案吗?

注意:该操作应使用let 进行评估,因为我在其他类型的操作(如按位操作)中需要这些数字。

【问题讨论】:

  • 你能用expr代替吗?
  • @MichaelGardner 我也想对这些数字使用按位运算。而expr不支持按位运算

标签: linux shell busybox openwrt ash


【解决方案1】:

busybox没有bash,它的shell是ash

您可以从变量中去掉前导零,例如:

while [ "${n:0:1}" = "0" ]; do n="${n#?}"; done

或使用expr:

$ echo $(expr 045 + 045)
90

【讨论】:

  • 我的回答中没有let。使用expr 而不是let
  • 例如:A="$(expr 045 + 045)"
  • expr 不支持按位运算
  • 不,但您的问题是如何简单地将两个数字相加。如果你的目标是别的东西,你必须在你的问题上更具体。此外,您可以拆分计算以同时使用两者。
  • 你没有问过 Bitwise,你问的是十进制算术。
【解决方案2】:

您可以在进行算术运算之前删除零:

n=005
shopt -s extglob
n1=${n##+(0)}
echo $n1

输出:

5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2019-04-29
    • 2012-06-13
    • 2013-02-27
    • 2012-02-19
    • 1970-01-01
    • 2011-08-21
    • 2015-09-15
    相关资源
    最近更新 更多