Hay dos formas de acercarse a lo que desea lograr.
1. Use $ BASH_VERSION
Es suficiente solo ver lo que hay en la $BASH_VERSION
variable. Personalmente usaría subshell así:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Tenga en cuenta que la <<<
sintaxis para here-doc no es portátil, si la va a usar /bin/sh
, que es Dash en Ubuntu y podría ser otra cosa en un sistema diferente
La forma alternativa es a través de la declaración del caso o si la declaración. Personalmente, haría esto:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Probablemente, en aras de la portabilidad, probablemente debería comprobar si dicha variable está configurada en primer lugar con algo como [ -n $BASH_VERSION ]
Esto se puede reescribir totalmente como una función para usar en un script. Algo largo las líneas de:
#!/bin/bash
version_above_4(){
# check if $BASH_VERSION is set at all
[ -z $BASH_VERSION ] && return 1
# If it's set, check the version
case $BASH_VERSION in
4.*) return 0 ;;
?) return 1;;
esac
}
if version_above_4
then
echo "Good"
else
echo "No good"
fi
Esto no es un trazador de líneas, aunque esto es mucho mejor. Calidad sobre cantidad.
2. Compruebe lo que está instalado
Para eso necesitas filtrar la salida de esta apt-cache policy
manera
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
También puede ser útil con algunos filtros a través de awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Tenga en cuenta que esto no es portátil, ya que si no hay dpkg
o está apt
instalado en un sistema (por ejemplo, RHEL o FreeBSD), no le servirá de nada.
3. Use set -e para salir del script si hay un error
Una forma de evitarlo es simplemente usar matrices asociativas y salir cuando bash
no pueda usarlas. set -e
la línea a continuación #!/bin/bash
permitirá que el script se cierre si el script no puede usar una matriz asociativa.
Esto requerirá que le diga explícitamente al usuario: "Oye, realmente necesitas bash versión 4.3 o superior, de lo contrario el script no funcionará". Luego, la responsabilidad recae en el usuario, aunque algunos podrían argumentar que este no es realmente un buen enfoque para el desarrollo de software.
4. Abandone toda esperanza y escriba scripts portátiles compatibles con POSIX
bash
los scripts no son portátiles porque su sintaxis no es compatible con el shell Bourne. Si el script que está escribiendo se va a usar en una variedad de sistemas diferentes, no solo en Ubuntu, abandone toda esperanza y encuentre formas de usar algo más que matrices asociativas. Eso podría incluir tener dos matrices o analizar un archivo de configuración. Considere también cambiar a un idioma diferente, Perl o Python, donde la sintaxis es al menos más portátil que bash
.
$BASH_VERSION
y$BASH_VERSINFO
?