我的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
。
任何帮助?
答案 0 :(得分:15)
bash
将您的号码视为八进制,因为前导零
man bash
前导0的常量是 解释为八进制数。一个 前导0x或0X表示十六进制。 否则,数字采用[base#] n的形式,其中base是小数 2至64之间的数字代表 - 算术基数,n是该基数中的数字。如果#是 省略,然后使用基数10.
要解决此问题,请指定基数为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
答案 1 :(得分:4)
根据this blog的建议,这有效:
#!/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
答案 2 :(得分: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