【问题标题】:Value too great for base (error token is "09")基础值太大(错误标记为“09”)
【发布时间】:2021-01-22 23:50:16
【问题描述】:

在运行我的 bash 脚本的这一部分时出现错误

脚本

value=0
for (( t=0; t <= 4; t++ ))
do
d1=${filedates[$t]}
d2=${filedates[$t+1]}
((diff_sec=d2-d1))
SEC=$diff_sec
compare=$((${SEC}/(60*60*24)))
value=$((value+compare))
done

输出

jad.sh: line 28: ((: 10#2014-01-09: value too great for base (error token is "09")
jad.sh: line 30: /(60*60*24): syntax error: operand expected (error token is "/(60*60*24)")

d1 和 d2 是 2014-01-09 和 2014-01-10 格式的日期

请问有什么解决办法吗?

【问题讨论】:

  • 您不能只减去 YYYY-MM-DD 形式的日期。您必须先将它们转换为纯数字,例如 time_t 时间戳(这将使您获得秒数)。
  • 看起来它正在将您的 09 转换为八进制表示法,因此它实际上可能是在尝试计算 2014 - 1 - 9,但由于 09 不是有效数字(前面的 0 表示使用八进制代替十进制)它在抱怨。
  • robbirt有什么解决办法?

标签: bash


【解决方案1】:

在变量前面添加字符串“10#”。这迫使 bash 将它们视为十进制,即使前导零通常会使它们成为八进制。

【讨论】:

    【解决方案2】:

    d1d2 是什么?它们是日期还是秒?

    通常,如果您尝试对包含零前缀的数字进行算术运算,例如09.

    例子:

    $ echo $((09+1))
    -bash: 09: value too great for base (error token is "09")
    

    为了执行以 0 为前缀的数字的算术运算,您需要通过指定 10# 来告诉 bash 使用 base-10:

    $ echo $((10#09+1))
    10
    

    【讨论】:

    • 如果我有一个变量持有 $date=2014-01-09 使用 10# 不会有好处。
    【解决方案3】:

    正如其他人所说,错误是由于 Bash 将带有前导零的数字序列解释为八进制数造成的。如果您可以控制创建日期值的过程并且您正在使用date,则可以在输出格式字符串前加上连字符以删除前导零填充。对于此示例,我假设您在 09:00 期间运行此命令。

    不带连字符的date格式前缀:

    $ if (( $(date +%H) < 10 )); then echo true; else echo false; fi
    -bash: ((: 09: value too great for base (error token is "09")
    false
    

    date 格式前加上连字符:

    $ if (( $(date +%-H) < 10 )); then echo true; else echo false; fi
    true
    

    来自date 手册页:

    默认情况下,日期用零填充数字字段。以下 可选标志可能跟在 '%' 后面:

      -      (hyphen) do not pad the field
    

    【讨论】:

      【解决方案4】:

      d1 和 d2 是 2014-01-09 和 2014-01-10 格式的日期

      然后

      ((diff_sec=d2-d1))
      

      你期望得到什么? ((diffsec=2014-01-09-2014-01-10))??

      您需要先将日期转换为秒:

      d1=$( date -d "${filedates[$t]}" +%s )
      d2=$( date -d "${filedates[$t+1]}" +%s )
      (( compare = (d2 - d1) / (60*60*24) ))
      (( value += compare ))
      

      【讨论】:

        【解决方案5】:

        arithmetic expansion 表达式中不需要${}。它应该是这样的:

        compare=$((SEC/(60*60*24)))
        

        【讨论】:

        • 解决了第二个错误。仍然是第一个错误“对于基础来说价值太大..”
        • 正如@robbrit 所说,从09 中删除前导零或更好地修复产生09 的代码。否则,它被视为八进制数。 (或查看 dogbane 的答案)
        【解决方案6】:

        对于日期中的“mm”和“dd”值,我使用这个技巧:

        mm="1${date:5,2}"  # where 5 is the offset to mm in the date
        let mm=$mm-100     # turn 108 into 8, and 109 into 9
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-03
          • 2014-03-12
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多