Bagaimana cara menghentikan Bash dari menafsirkan kode oktal bukan bilangan bulat?

13

Saya sedang menulis naskah Horoskop RSS sebagai pengantar untuk proyek Unix / Linux, dan mengalami masalah yang tidak dapat diperbaiki oleh Profesor saya pada saat saya dapat tinggal di kelas. Karena saya tidak tahu bagaimana menggunakan tanggal aktual sebagai apa yang harus diperiksa, saya pikir saya akan mencoba aritmatika dasar dengan meminta input pengguna menjadi angka standar dalam format MMDD. Menurutnya, skrip tampaknya membaca input sebagai kode oktal bukan bilangan bulat. Berikut contoh skrip:

    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

Ini adalah tulang telanjang, saya mengambil bagian RSS. "olddate" adalah input yang diharapkan dari prompt baca saya. Sementara 1121 hingga 1131, 1200 hingga 1222, dan 0100 hingga 0120 berfungsi, tidak ada yang berfungsi antara 1221 hingga 1232. Dia mengira itu adalah masalah karena menempatkan 113 tanpa angka 0 bekerja untuk Capricorn. Saya juga baru saja mengalami masalah di mana 0323 yang seharusnya memberi saya Aries (-gt 0320 && -lt 0332) memberi saya Aquarius (yang tanggalnya -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) sebagai serta 0417 tidak berfungsi (yang merupakan rentang tanggal lainnya untuk Aries, -gt 0400 && -lt 0420).

Apa yang harus saya lakukan agar BASH menginterpretasikan input sebagai angka aktual? Dia mencoba mengubah prompt baca untuk mengharapkan "userdate" sebagai input dan kemudian menambahkan

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

tapi itu tidak berhasil. Terima kasih sebelumnya kepada siapa saja yang dapat membantu saya dalam hal ini!

Irre Levant
sumber
Tidak dapat menggandakan pada bash 4.4.12.
Ignacio Vazquez-Abrams
1
$ olddate adalah string, bukan angka, jadi gunakan perbandingan string dan hindari seluruh kekacauan.
Stephen Harris
2
@StephenHarris: Begitu juga nilainya di sebelah kanan operator. Itu sebabnya testmemiliki operator numerik eksplisit.
Ignacio Vazquez-Abrams
Satu hal yang perlu diperhatikan, tetapi tidak terkait dengan pertanyaan inti, adalah bahwa tanda zodiak Anda juga sebagian tergantung pada tahun Anda dilahirkan, jika hari dan bulan kelahiran Anda dekat dengan transisi antara 2 tanda zodiak. Zodiak Anda didasarkan pada 1/12 bagian langit tempat matahari berada pada saat Anda dilahirkan, tetapi karena jumlah hari dalam setahun bukan angka keseluruhan atau tidak dapat dibagi dengan 12, ada beberapa variasi dari tahun ke tahun. Variasi ini terlalu rumit untuk benar-benar ditangkap di pohon if-else, tetapi itu hanya sesuatu yang mungkin baik untuk diketahui.
Nzall

Jawaban:

28

Anda dapat memaksa konversi nomor ke basis tertentu di bash seperti:

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

Secara umum formatnya adalah $((base#value)).

Ignacio Vazquez-Abrams
sumber