私は Unix/Linux 入門プロジェクトとして Horoscope RSS スクリプトを書いていますが、授業後に残っていた時間内に教授が解決できなかった問題に遭遇しました。実際の日付をチェック対象として使用する方法がわからなかったので、ユーザー入力を MMDD 形式の標準数値にして基本的な算術を試してみようと思いました。彼によると、スクリプトは入力を整数ではなく 8 進コードとして読み取っているようです。スクリプトのサンプルを以下に示します。
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 を入力すると Capricorn では機能したため、これが問題だと彼は考えました。また、0323 を入力すると Aries (-gt 0320 && -lt 0332) になるはずが Aquarius (日付は -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) になり、0417 (Aries の別の日付範囲、-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))
。