Jak powstrzymać Basha przed interpretowaniem kodu ósemkowego zamiast liczby całkowitej?

13

Piszę skrypt Horoskop RSS jako wprowadzenie do projektu Unix / Linux, i natknąłem się na problem, którego mój profesor nie mógł naprawić w czasie, gdy mogłem zostać po zajęciach. Ponieważ nie mogłem wymyślić, jak używać rzeczywistych dat do sprawdzania, pomyślałem, że spróbuję podstawowej arytmetyki, wprowadzając przez użytkownika standardowe liczby w formacie MMDD. Według niego skrypt wydaje się czytać dane wejściowe jako kod ósemkowy zamiast liczby całkowitej. Oto próbka skryptu:

    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

To są nagie kości, wyjąłem część RSS. „olddate” to oczekiwany wkład z mojego monitu o odczyt. Podczas gdy 1121 do 1131, 1200 do 1222 i 0100 do 0120 działają, nic między 1221 a 1232 nie działa. Uznał, że to jest problem, ponieważ postawienie 113 bez wiodącego 0 działało dla Koziorożca. Właśnie natrafiłem na problem polegający na tym, że 0323, który miał mi dać Barana (-t 0320 i & -t 0332) dał mi Wodnika (którego daty to -t0119 i & -t 0132 || -tt 0200 i & -lt 0219) jako również 0417 nie działa (co jest drugim zakresem dat dla Barana, -gt 0400 i< 0420).

Co mam zrobić, aby BASH interpretował dane wejściowe jako liczby rzeczywiste? Próbował zmienić monit odczytu, aby oczekiwał „danych użytkownika” jako danych wejściowych, a następnie dodał

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

ale to nie zadziałało. Z góry dziękuję wszystkim, którzy mogą mi w tym pomóc!

Nieistotny
źródło
Nie można powielić na bash 4.4.12.
Ignacio Vazquez-Abrams
1
$ olddate jest ciągiem, a nie liczbą, więc używaj porównań ciągów i unikaj całego bałaganu.
Stephen Harris
2
@StephenHarris: Podobnie jak wartości po prawej stronie operatorów. Dlatego testma wyraźne operatory numeryczne.
Ignacio Vazquez-Abrams
Jedną rzeczą do odnotowania, ale niezwiązaną z kluczowym pytaniem, jest to, że twój znak zodiaku jest częściowo zależny od roku, w którym się urodziłeś, jeśli twój dzień i miesiąc urodzenia były bliskie przejścia między dwoma znakami zodiaku. Twój znak zodiaku jest oparty na 1/12 części nieba, w której znajdowało się słońce w chwili urodzenia, ale ponieważ liczba dni w roku nie jest liczbą całkowitą ani nie dzieli się przez 12, istnieje pewna różnica od z roku na rok. Ta odmiana jest zbyt złożona, aby naprawdę uchwycić ją na drzewach if-else, ale jest to po prostu coś, co warto wiedzieć.
Nzall,

Odpowiedzi:

28

Możesz wymusić konwersję liczby do konkretnej bazy w bash w następujący sposób:

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

Ogólnie format to $((base#value)).

Ignacio Vazquez-Abrams
źródło