Estoy escribiendo un script que usa read -i
, por lo que requiere Bash 4.0 o posterior.
Desafortunadamente, a partir de 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 secuencia de comandos detecte si Bash es lo suficientemente nuevo y salga con un útil mensaje de error que indique al usuario que actualice.
Sé que puedo comparar ${BASH_VERSION}
, pero esa es una cadena con un formato no numérico y potencialmente poco confiable. Se siente 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
}
Respuesta aceptada:
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-ésimo. También puede usar ((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 (el lanzamiento).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 lanzamiento (por ejemplo, beta1).BASH_VERSINFO[5]
El valor de MACHTYPE
.