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

Irr*_*ant 13 bash numeric-data printf

我正在编写一个星座 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
Run Code Online (Sandbox Code Playgroud)

这是最基本的,我拿出了RSS部分。“olddate”是我阅读提示中的预期输入。虽然 1121 到 1131、1200 到 1222 和 0100 到 0120 有效,但 1221 到 1232 之间没有任何作用。他认为这就是问题所在,因为在没有领先 0 的情况下放置 113 对摩羯座有效。我也遇到了一个问题,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"`
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 30

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

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100
Run Code Online (Sandbox Code Playgroud)

一般格式为$((base#value)).