Как остановить Bash от интерпретации восьмеричного кода вместо целого?

13

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

Что мне делать, чтобы BASH интерпретировал ввод как фактические числа? Он попытался изменить приглашение на чтение, чтобы ожидать ввода «userdate», а затем добавил

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

но это не сработало. Заранее спасибо всем, кто может мне помочь в этом!

Ирре Левант
источник
Не могу дублировать на Bash 4.4.12.
Игнасио Васкес-Абрамс
1
$ olddate - это строка, а не число, поэтому используйте сравнения строк и избегайте всей путаницы.
Стивен Харрис
2
@StephenHarris: Значения справа от операторов. Вот почему testимеет явные числовые операторы.
Игнасио Васкес-Абрамс
Следует отметить одну вещь, но не связанную с основным вопросом, это то, что ваш знак зодиака также частично зависит от года, в котором вы родились, если ваш день и месяц рождения были близки к переходу между двумя знаками зодиака. Ваш знак зодиака основан на 1/12 части неба, в которой солнце находилось в то время, когда вы родились, но поскольку число дней в году не является целым числом и не делится на 12, есть некоторые отличия от из года в год. Эта вариация слишком сложна, чтобы ее действительно можно было увидеть в деревьях if-else, но это просто то, что может быть полезно знать.
17

Ответы:

28

Вы можете принудительно преобразовать число в конкретную базу в bash следующим образом:

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

В общем, формат есть $((base#value)).

Игнасио Васкес-Абрамс
источник