
Я пишу скрипт, использующий read -i
, поэтому ему требуется Bash 4.0 или новее.
К сожалению, по состоянию на начало 2020 года macOS все еще поставляется с Bash 3.x, и многие пользователи моего скрипта будут использовать Mac. Поскольку Apple изменила оболочку по умолчанию на zsh, у меня нет надежды, что они обновят версию, включенную в комплект.
Поэтому я хочу, чтобы мой скрипт определял, достаточно ли нова версия Bash, и завершал работу с полезным сообщением об ошибке, которое предлагает пользователю выполнить обновление.
Я знаю, что могу сравнить ${BASH_VERSION}
, но это строка с нечисловым, потенциально ненадежным форматом. Кажется хрупким делать предположения о нем.
Как лучше всего этого добиться?
requireBash4() {
if <something here>; then
>&2 echo "Bash 4.0 or newer is required."
>&2 echo "Once you're upgraded, re-run this script."
exit 1
fi
}
решение1
if ((BASH_VERSINFO >= 4)); then ...
Обратите внимание, что BASH_VERSINFO
это массив. Как и в случае с любым массивом в bash, использование его в качестве простой переменной ссылается на его 0-й элемент. Вы также можете использовать , ((BASH_VERSINFO[0] >= 4))
если посчитаете это более понятным.
И да, эта переменная и синтаксис поддерживаются как минимум с bash 2.0.
BASH_VERSINFO
Переменная массива только для чтения, элементы которой содержат информацию о версии для этого экземпляра bash. Значения, назначенные элементам массива, следующие:
BASH_VERSINFO[0]
Основной номер версии (релиз).
BASH_VERSINFO[1]
Дополнительный номер версии (версия).
BASH_VERSINFO[2]
Уровень исправления.
BASH_VERSINFO[3]
Версия сборки.
BASH_VERSINFO[4]
Статус релиза (например, beta1).
BASH_VERSINFO[5]
ЗначениеMACHTYPE
.