Como posso detectar o Bash> = 4.0?

Como posso detectar o Bash> = 4.0?

Estou escrevendo um script que usa read -i, portanto requer Bash 4.0 ou mais recente.

Infelizmente, no início de 2020, o macOS ainda vem com Bash 3.x, e muitos usuários do meu script usarão Macs. Como a Apple mudou o shell padrão para zsh, não tenho esperança de que eles atualizem a versão incluída.

Dessa forma, quero que meu script detecte se o Bash é novo o suficiente e saia com uma mensagem de erro útil que direcione o usuário para a atualização.

Eu sei que posso comparar ${BASH_VERSION}, mas é uma string com um formato não numérico e potencialmente não confiável. Parece frágil fazer suposições sobre isso.

Qual é a melhor maneira de conseguir isso?

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
}

Responder1

if ((BASH_VERSINFO >= 4)); then ...

Observe que BASH_VERSINFOé uma matriz. Como acontece com qualquer array no bash, usá-lo como uma variável simples refere-se ao seu 0º elemento. Você também pode usar ((BASH_VERSINFO[0] >= 4))se achar mais claro.

E sim, esta variável e sintaxe são suportadas desde pelo menos o bash 2.0.

BASH_VERSINFO

Uma variável de matriz somente leitura cujos membros contêm informações de versão para esta instância do bash. Os valores atribuídos aos membros da matriz são os seguintes:

BASH_VERSINFO[0] O número da versão principal (o lançamento).
BASH_VERSINFO[1] O número da versão secundária (a versão).
BASH_VERSINFO[2] O nível do patch.
BASH_VERSINFO[3] A versão de construção.
BASH_VERSINFO[4] O status da versão (por exemplo, beta1).
BASH_VERSINFO[5] O valor de MACHTYPE.

informação relacionada