Як я можу зупинити Bash від інтерпретації восьмеричного коду замість цілого?


13

Я пишу RSS-скрипт гороскопа як вступ до проекту Unix / Linux, і я зіткнувся з проблемою, яку мій професор не зміг виправити в той час, коли мені вдалося залишитися після уроку. Оскільки я не міг зрозуміти, як використовувати фактичні дати як те, що потрібно перевірити, я подумав, що спробую провести базову арифметику за допомогою введення користувачем стандартних чисел у форматі MMDD. За його словами, сценарій, здається, читає введення як восьмеричний код замість цілого. Ось зразок сценарію:

    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 не робить. Він подумав, що це проблема, оскільки поставити 113 без ведучих 0 працював на Козерога. Я також щойно зіткнувся з проблемою, коли 0323, який повинен був дати мені Овна (-gt 0320 && -lt 0332) подарував мені Водолія (дати якого -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) як а також 0417 не працює (що є іншим діапазоном дат для Овна, -gt 0400 && -lt 0420).

Що робити, щоб BASH інтерпретував введення як фактичні числа? Він спробував змінити підказку читання, щоб очікувати "введення даних користувача" як введення, а потім додавання

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

але це не спрацювало. Заздалегідь дякую всім, хто може мені допомогти у цьому!


Неможливо дублювати на bash 4.4.12.
Ігнасіо Васкес-Абрамс

1
$ olddate - це рядок, а не число, тому використовуйте порівняння рядків і уникайте цілого безладу.
Стівен Харріс

2
@StephenHarris: Значення праворуч від операторів. Ось чому testє явні числові оператори.
Ігнасіо Васкес-Абрамс

Одне, що слід зазначити, але не пов'язане з основним питанням, - це те, що ваш знак зодіаку також частково залежить від року, в якому ви народилися, якщо ваш день і місяць народження були близькими до переходу між двома знаками зодіаку. Ваш знак зодіаку ґрунтується на 1/12 частині неба, на якій знаходилось сонце в той час, коли ви народилися, але оскільки кількість днів у році не є цілим числом, ані ділиться на 12, є певна різниця від з року в рік. Ця варіація є надто складною для того, щоб справді зафіксувати іначе дерева, але це може бути корисно знати.
Nzall

Відповіді:


28

Ви можете примусити перетворення числа в конкретну базу в bash:

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

Загалом формат є $((base#value)).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.