Bashが整数ではなく8進コードを解釈しないようにするにはどうすればよいですか?


13

私はHoroscope RSSスクリプトをUnix / Linuxプロジェクトのイントロとして書いていますが、授業後に留まることができたときに教授が解決できない問題に遭遇しました。実際の日付をチェック対象として使用する方法がわからなかったため、ユーザー入力に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を入れたので、それが問題だと考えました。また、Aries(-gt 0320 && -lt 0332)からAquarius(日付は-gt 0119 && -lt 0132 || -gt 0200 && -lt 0219)が得られるはずだった0323で問題が発生しました。 0417が機能しない(Ariesの他の日付範囲、-gt 0400 && -lt 0420)。

BASHが入力を実際の数値として解釈するようにするにはどうすればよいですか?彼は入力として「userdate」を期待するように読み取りプロンプトを変更してから、追加しようとしました

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

しかし、それはうまくいきませんでした。これで私を助けることができる人に事前に感謝します!


bash 4.4.12では複製できません。
イグナシオバスケス-エイブラムス

1
$ olddateは数字ではなく文字列なので、文字列比較を使用して混乱を避けてください。
スティーブンハリス

2
@StephenHarris:演算子の右側の値も同様です。そのためtest、明示的な数値演算子があります。
イグナシオバスケス-エイブラムス

注意すべきことの1つは、核心的な質問とは無関係ですが、生まれた日と月が2つの星座の間の移行に近い場合、星座は生まれた年にも部分的に依存するということです。あなたの星座はあなたが生まれたときに太陽があった空の1/12の部分に基づいていますが、1年の日数は整数でも12で割り切れないため、年々。このバリエーションはif-elseツリーで実際にキャプチャするには複雑すぎますが、知っておくとよいかもしれません。
-Nzall

回答:


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.