¿Cómo puedo detectar Bash >=4.0?

¿Cómo puedo detectar Bash >=4.0?

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_VERSINFOes 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 de MACHTYPE.

información relacionada