值对于基数来说太大(错误标记为“0925”)

发布于 2024-10-26 21:01:51 字数 474 浏览 7 评论 0原文

我的 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:需要整数表达式

有什么帮助吗?

I have the following logic in my bash script:

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

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

Every now and then, I get the error specified in the title (any time above 08xx appears to trigger the error).

Any suggestions on how to fix this?

I am running on Ubuntu 10.04 LTS

[Edit]

I modified the script as suggested by SiegeX, and now, I am getting the error: [: 10#0910: integer expression expected.

Any help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你的他你的她 2024-11-02 21:01:51

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

bash is treating your numbers as octal because of the leading zero

From man bash

Constants with a leading 0 are
interpreted as octal numbers. A
leading 0x or 0X denotes hexadecimal.
Otherwise, numbers take the form [base#]n, where base is a decimal
number between 2 and 64 represent-
ing the arithmetic base, and n is a number in that base. If base# is
omitted, then base 10 is used.

To fix it, specify the base-10 prefix

#!/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
も让我眼熟你 2024-11-02 21:01:51

遵循 的建议这个博客,这有效:

#!/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

Following the advice from this blog, this works:

#!/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
做个ˇ局外人 2024-11-02 21:01:51

解决条件测试中的问题

由于多种原因(例如文件命名问题),人们可能被迫保持变量不变。如果是这种情况,请通过显式指定基数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

Solving the issue within the conditional test

One may be forced to keep the variable as it is for a variety of reasons (e.g. file naming issues). If this is the case, solve the issue within the conditional test by explicitly specifying 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文