【问题标题】:Strange behaviour while multiplying negative number with -1将负数乘以-1时的奇怪行为
【发布时间】:2013-05-10 11:59:06
【问题描述】:

我正在使用 bash 编写脚本,我得到这样的负数

-001 , -002 , -003 , ........................., -008 , -009 , -010 , -011 , -012 .....

我必须将它们更改为正数,所以我决定将它们乘以 -1。 那么

$ val=$(( -1*-001 ))
$ echo $val
$ 1
$ val=$(( -1*-002 ))
$ echo $val
$ 2

结果在 -007 之前都很好,但是当我与 -008 和 -009 相乘时,会出现如下错误

$ val=$(( -1*-008 ))
bash: -1*-008: value too great for base (error token is "008")

$ val=$(( -1*-009 ))
bash: -1*-009: value too great for base (error token is "009")

另一个奇怪的行为是,当我与 -010、-011、-012 等相乘时......不寻常的结果如下所示

$ val=$(( -1*-010 ))
$ echo $val
$ 8
$ val=$(( -1*-011 ))
$ echo $val
$ 9
$ val=$(( -1*-012 ))
$ echo $val
$ 10
$ val=$(( -1*-013 ))
$ echo $val
$ 11

and so on............

为什么会这样?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    前导零表示八进制数。 010和10不是同一个数字;第一个是八进制:010 八进制是十进制的 8。同样,“009”不是实数,因此您看到的错误是:is no digit "9" in octal.

    您需要去掉前导零。

    【讨论】:

    • 谢谢我得到答复。什么是去除前导零的简单方法。你能帮忙吗?
    • 您首先应避免输入前导零。如果你想知道如何剥离它们,ask another question.
    【解决方案2】:

    您可以强制使用带有 10# 前缀的十进制(而不是八进制)值:

    $ val=$(( -1*-10#008 ))
    $ echo $val
    8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多