数值过大,超出了基数范围(错误标记为“0925”)。

13

我在我的bash脚本中有以下逻辑:

#!/bin/bash
local_time=$(date +%H%M)

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
 # do something
fi

时不时地,我会遇到标题中指定的错误(任何高于08xx的时间似乎都会触发此错误)。

有什么建议可以解决这个问题吗?

我正在运行 Ubuntu 10.04 LTS。

[编辑]

我按照 SiegeX 的建议修改了脚本,现在出现错误:[: 10#0910: integer expression expected

需要帮助吗?

3个回答

17

bash因为前导零将您的数字视为八进制

摘自bash手册

具有前导0的常量被解释为八进制数。 前导0x或0X表示十六进制。否则,数字采用[base#] n的形式,其中base是介于2和64之间的十进制数字,表示算术基数,n是该基数中的一个数字。 如果省略了base#,则使用base 10。

要修复它,请指定十进制前缀。

#!/bin/bash
local_time="10#$(date +%H%M)"

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
 # do something
fi

我按照你的建议修改了我的脚本,几分钟前运行了一下,然后收到了以下错误信息:[: 10#0910: 需要整数表达式。 - oompahloompah
@oompah:嗯,在我这里或者在这里列出的ideone上运行时没有错误。你使用的bash版本是什么? - SiegeX
我的 Bash 版本详细信息是:GNU bash,版本 4.1.5(1)-release (x86_64-pc-linux-gnu)。 - oompahloompah
@oompa:我不知道该告诉你什么。你是否完全复制并粘贴了我的代码并尝试运行它?将“#do something”替换为简单的“echo foo”,以确保您没有粘贴错误的代码。 - SiegeX
1
谢谢。我已经使用了“10$f”来表示一个$f变量,它运行良好。 - Wok

4

根据这篇博客的建议,以下方法可行:

#!/bin/bash
local_time=`date +%H%M`
local_time="$(( 10#$local_time ))"

if (( ( local_time > 1430  && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then
    echo "it is time!"
fi

1

在条件测试中解决问题

由于各种原因(例如文件命名问题),可能被迫保留变量。如果是这种情况,可以通过在条件测试中显式指定基数10#来解决问题。

#!/bin/bash
local_time=$(date +%H%M)

if (( ( 10#${local_time} > 1430  && 10#${local_time} < 2230 ) || ( 10#${local_time} > 0300 && 10#${local_time} < 0430 ) )); then
 # do something
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接