
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 deMACHTYPE
.