Как определить Bash >=4.0?

Как определить Bash >=4.0?

Я пишу скрипт, использующий 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.

Связанный контент