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!
źródło
test
ma wyraźne operatory numeryczne.Odpowiedzi:
Możesz wymusić konwersję liczby do konkretnej bazy w bash w następujący sposób:
Ogólnie format to
$((base#value))
.źródło