如何阻止 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 之間沒有任何功能。他認為這就是問題所在,因為在摩羯座中輸入沒有前導 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"`

但這沒有用。預先感謝任何可以幫助我解決這個問題的人!

答案1

您可以在 bash 中強制將數字轉換為特定基數,如下所示:

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

一般情況下,格式為$((base#value)).

相關內容