如何阻止 Bash 解释八进制代码而不是整数?

如何阻止 Bash 解释八进制代码而不是整数?

我正在编写一个星座 RSS 脚本作为 Unix/Linux 项目的介绍,但在我下课后留下来的时候遇到了我的教授无法解决的问题。由于我不知道如何使用实际日期作为检查内容,因此我想通过让用户输入为 MMDD 格式的标准数字来尝试基本算术。据他说,该脚本似乎将输入读取为八进制代码而不是整数。这是脚本的示例:

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit

这是大概的内容,我把 RSS 部分拿出来了。 “olddate”是我的阅读提示的预期输入。虽然 1121 到 1131、1200 到 1222 以及 0100 到 0120 可以工作,但 1221 到 1232 之间没有任何功能。他认为这就是问题所在,因为在摩羯座中输入 113 且不带前导 0 是有效的。我还遇到了一个问题,其中 0323 应该给我白羊座(-gt 0320 && -lt 0332)却给了我水瓶座(其日期是 -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219)以及 0417 不起作用(这是白羊座的另一个日期范围,-gt 0400 && -lt 0420)。

我该怎么做才能让 BASH 将输入解释为实际数字?他尝试更改读取提示以期望“userdate”作为输入,然后添加

olddate=`printf '%d\n' "$userdate"`

但这没有用。预先感谢任何可以帮助我解决这个问题的人!

答案1

您可以在 bash 中强制将数字转换为特定基数,如下所示:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

一般情况下,格式为$((base#value)).

相关内容