Ci sono un paio di modi per affrontare ciò che vuoi ottenere.
1. Usa $ BASH_VERSION
È sufficiente vedere solo cosa c'è nella $BASH_VERSION
variabile. Personalmente userei subshell in questo modo:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Nota che la <<<
sintassi per here-doc non è portatile, se hai intenzione di usarla /bin/sh
, che è Dash su Ubuntu e potrebbe essere qualcos'altro su un sistema diverso
Il modo alternativo è tramite la dichiarazione case o if. Personalmente, farei questo:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Probabilmente per motivi di portabilità, probabilmente dovresti controllare se tale variabile è addirittura impostata in primo luogo con qualcosa di simile [ -n $BASH_VERSION ]
Questo può essere completamente riscritto come funzione da utilizzare in uno script. Qualcosa di molto lungo le linee di:
#!/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
Questo non è un liner, sebbene sia molto meglio. Qualità più che quantità.
2. Controlla cosa è installato
Per questo è necessario filtrare l'output in questo apt-cache policy
modo
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
può anche tornare utile con alcuni filtri tramite awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Nota che questo non è portatile, poiché se non è presente dpkg
o apt
installato su un sistema (ad esempio, RHEL o FreeBSD), non ti farà nulla di buono.
3. Utilizzare set -e per uscire dallo script in caso di errore
Un modo per aggirarlo è semplicemente andare avanti usando array associativi e uscire quando bash
non è possibile utilizzarli. set -e
la riga seguente #!/bin/bash
consentirà di chiudere lo script se lo script non può utilizzare l'array associativo.
Ciò richiederà di dire esplicitamente all'utente: "Ehi, hai davvero bisogno di bash versione 4.3 o successiva, altrimenti lo script non funzionerà". Quindi la responsabilità spetta all'utente, anche se alcuni potrebbero sostenere che questo non è davvero un buon approccio allo sviluppo del software.
4. Abbandonare ogni speranza e scrivere script portatili, conformi a POSIX
bash
gli script non sono portatili perché la sua sintassi non è compatibile con la shell Bourne. Se lo script che stai scrivendo verrà utilizzato su una gamma di sistemi diversi, non solo Ubuntu da solo, allora abbandona ogni speranza e trova modi per utilizzare qualcosa di diverso dagli array associativi. Ciò potrebbe includere la presenza di due array o l'analisi di un file di configurazione. Considera anche il passaggio a una lingua diversa, Perl o Python, in cui la sintassi è almeno più portabile di bash
.
$BASH_VERSION
e$BASH_VERSINFO
?