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.

有什么帮助吗?

4

3 回答 3

17

bash由于前导零,将您的数字视为八进制

man bash

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

要修复它,请指定 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
于 2011-03-28T07:24:06.100 回答
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
于 2012-09-11T15:16:57.683 回答
1

在条件测试中解决问题

由于各种原因(例如文件命名问题),人们可能会被迫保持变量不变。如果是这种情况,请通过显式指定 base 来解决条件测试的问题: 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
于 2016-02-29T06:27:18.220 回答