
Estoy escribiendo un script que usa read -i
, por lo que requiere Bash 4.0 o posterior.
Desafortunadamente, a principios de 2020, macOS todavía viene con Bash 3.x y muchos usuarios de mi script usarán Mac. Dado que Apple cambió el shell predeterminado a zsh, no tengo esperanzas de que actualicen la versión incluida.
Como tal, quiero que mi script detecte si Bash es lo suficientemente nuevo y salga con un mensaje de error útil que indique al usuario que actualice.
Sé que puedo comparar ${BASH_VERSION}
, pero es una cadena con un formato no numérico y potencialmente poco confiable. Parece frágil hacer suposiciones al respecto.
¿Cuál es la mejor manera de lograr esto?
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
}
Respuesta1
if ((BASH_VERSINFO >= 4)); then ...
Observe que BASH_VERSINFO
es una matriz. Al igual que con cualquier matriz en bash, usarla como una variable simple se refiere a su elemento 0. También puedes utilizarlo ((BASH_VERSINFO[0] >= 4))
si lo encuentras más claro.
Y sí, esta variable y sintaxis son compatibles desde al menos bash 2.0.
BASH_VERSINFO
Una variable de matriz de solo lectura cuyos miembros contienen información de versión para esta instancia de bash. Los valores asignados a los miembros de la matriz son los siguientes:
BASH_VERSINFO[0]
El número de versión principal (la versión).
BASH_VERSINFO[1]
El número de versión secundaria (la versión).
BASH_VERSINFO[2]
El nivel del parche.
BASH_VERSINFO[3]
La versión de compilación.
BASH_VERSINFO[4]
El estado de la versión (por ejemplo, beta1).
BASH_VERSINFO[5]
El valor deMACHTYPE
.