Il y a deux façons d'aborder ce que vous voulez réaliser.
1. Utiliser $BASH_VERSION
Il suffit de voir ce qu'il y a dedans $BASH_VERSION
variable. Personnellement, j'utiliserais subshell comme suit :
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Il convient de noter que <<<
pour here-doc n'est pas portable, si vous voulez l'utiliser avec /bin/sh
qui est Dash sur Ubuntu et peut être autre chose sur un autre système
L'autre solution consiste à utiliser l'instruction case ou l'instruction if. Personnellement, c'est ce que je ferais :
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Pour des raisons de portabilité, vous devriez probablement vérifier si une telle variable est définie en premier lieu avec quelque chose comme [ -n $BASH_VERSION ]
Ce totalement peut être réécrit comme une fonction à utiliser dans un script. Quelque chose de l'ordre 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
Il ne s'agit pas d'un one-liner, même si celui-ci est bien meilleur. La qualité prime sur la quantité.
2. Vérifier ce qui est installé
Pour cela, vous devez filtrer la sortie de apt-cache policy
ainsi
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
peut également s'avérer utile avec un certain filtrage via awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Notez que ce n'est pas portable, car s'il n'y a pas de dpkg
o apt
installé sur un système (par exemple, RHEL ou FreeBSD), il ne vous sera d'aucune utilité.
3. Utilisez set -e pour quitter script en cas d'erreur.
Une façon de contourner ce problème est d'utiliser des tableaux associatifs et d'abandonner lorsque bash
ne peuvent pas les utiliser. set -e
ligne ci-dessous #!/bin/bash
permet au script de quitter si le script ne peut pas utiliser un tableau associatif.
Cela vous obligera à dire explicitement à l'utilisateur : "Hé, vous avez vraiment besoin de la version 4.3 ou supérieure de bash, sinon le script ne fonctionnera pas". La responsabilité incombe alors à l'utilisateur, bien que certains puissent affirmer qu'il ne s'agit pas là d'une bonne approche du développement logiciel.
4. Abandonner tout espoir et écrire des scripts portables et conformes à POSIX.
bash
Les scripts ne sont pas portables car leur syntaxe n'est pas compatible avec le scripts de Bourne. Si le scripts que vous écrivez est destiné à être utilisé sur différents systèmes, et pas seulement sur Ubuntu, alors abandonnez tout espoir, et trouvez des moyens d'utiliser autre chose que des tableaux associatifs. Cela peut inclure deux tableaux ou l'analyse d'un fichier de configuration. Envisagez également de passer à un autre langage, Perl ou Python, dont la syntaxe est au moins plus portable que celle de bash
.