Es gibt verschiedene Möglichkeiten, sich dem zu nähern, was Sie erreichen möchten.
1. Verwenden Sie $ BASH_VERSION
Es reicht aus, nur zu sehen, was in der $BASH_VERSION
Variablen enthalten ist. Persönlich würde ich Subshell wie folgt verwenden:
$ (read -d "." version trash <<< $BASH_VERSION; echo "$version" )
4
Beachten Sie, dass die <<<
Syntax für here-doc nicht portierbar ist, wenn Sie sie verwenden möchten. Dies /bin/sh
ist Dash unter Ubuntu und möglicherweise etwas anderes auf einem anderen System
Der alternative Weg ist über die case-Anweisung oder die if-Anweisung. Persönlich würde ich das tun:
bash-4.3$ case $BASH_VERSION in 4.*) echo "Can use associative arrays";; ?) echo "can't use associative arrays" ;; esac
Can use associative arrays
Wahrscheinlich sollten Sie aus Gründen der Portabilität prüfen, ob eine solche Variable überhaupt erst mit so etwas gesetzt wurde [ -n $BASH_VERSION ]
Dies kann vollständig als Funktion umgeschrieben werden, die in einem Skript verwendet werden soll. Etwas langes die Zeilen von:
#!/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
Dies ist kein Einzeiler, obwohl dies viel besser ist. Qualität vor Quantität.
2. Überprüfen Sie, was installiert ist
Dafür müssen Sie die Ausgabe von apt-cache policy
so filtern
$ apt-cache policy bash | awk -F '[:.]' '/Installed:/{printf "%s\n",substr($2,2)}'
4
dpkg-query
kann auch mit etwas Filterung über nützlich sein awk
.
$ dpkg-query -W bash | awk '{print substr($2,1,1)}'
4
Beachten Sie, dass dies nicht portabel ist, da es Ihnen nichts nützt, wenn auf einem System (z. B. RHEL oder FreeBSD) kein System installiert dpkg
oder apt
installiert ist.
3. Beenden Sie das Skript mit set -e, wenn ein Fehler auftritt
Eine Möglichkeit, dies zu umgehen, besteht darin, einfach assoziative Arrays zu verwenden und zu beenden, wenn bash
sie nicht verwendet werden können. set -e
In der folgenden Zeile #!/bin/bash
kann das Skript beendet werden, wenn das Skript kein assoziatives Array verwenden kann.
Dazu müssen Sie dem Benutzer explizit mitteilen: "Hey, Sie benötigen wirklich Bash-Version 4.3 oder höher, sonst funktioniert das Skript nicht." Dann liegt die Verantwortung beim Benutzer, obwohl einige argumentieren könnten, dass dies kein wirklich guter Ansatz für die Softwareentwicklung ist.
4. Geben Sie alle Hoffnung auf und schreiben Sie tragbare, POSIX-kompatible Skripte
bash
Skripte sind nicht portierbar, da ihre Syntax nicht mit der Bourne-Shell kompatibel ist. Wenn das Skript, das Sie schreiben, auf einer Reihe verschiedener Systeme verwendet werden soll, nicht nur auf Ubuntu allein, dann geben Sie alle Hoffnung auf und finden Sie Möglichkeiten, etwas anderes als assoziative Arrays zu verwenden. Dies kann das Vorhandensein von zwei Arrays oder das Parsen einer Konfigurationsdatei umfassen. Wechseln Sie auch zu einer anderen Sprache, Perl oder Python, bei der die Syntax zumindest portabler ist als bash
.
$BASH_VERSION
und angesehen$BASH_VERSINFO
?