Ich schreibe ein Skript, das read -i
verwendet , daher ist Bash 4.0 oder neuer erforderlich.
Leider wird macOS Anfang 2020 immer noch mit Bash 3.x ausgeliefert, und viele Benutzer meines Skripts werden Macs verwenden. Da Apple die Standard-Shell auf zsh geändert hat, habe ich keine Hoffnung, dass sie die gebündelte Version aktualisieren werden.
Daher möchte ich, dass mein Skript erkennt, ob Bash neu genug ist, und sich mit einer hilfreichen Fehlermeldung beendet, die den Benutzer zum Upgrade auffordert.
Ich weiß, dass ich ${BASH_VERSION}
vergleichen kann , aber das ist eine Zeichenfolge mit einem nicht numerischen, potenziell unzuverlässigen Format. Es fühlt sich zerbrechlich an, Vermutungen darüber anzustellen.
Was ist der beste Weg, dies zu erreichen?
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
}
Akzeptierte Antwort:
if ((BASH_VERSINFO >= 4)); then ...
Beachten Sie, dass BASH_VERSINFO
ist ein Array. Wie bei jedem Array in Bash bezieht sich die Verwendung als einfache Variable auf sein 0-tes Element. Sie können auch ((BASH_VERSINFO[0]>=4))
verwenden wenn Sie es klarer finden.
Und ja, diese Variable und Syntax werden mindestens seit Bash 2.0 unterstützt.
BASH_VERSINFO
Eine schreibgeschützte Array-Variable, deren Mitglieder Versionsinformationen
für diese Instanz von bash enthalten. Die den Mitgliedern des Arrays
zugewiesenen Werte lauten wie folgt:
BASH_VERSINFO[0][code> Die Hauptversionsnummer (das Release).
BASH_VERSINFO[1]
Die Nebenversionsnummer (die Version).BASH_VERSINFO[2]
Das Patch-Level.BASH_VERSINFO[3]
Die Build-Version.BASH_VERSINFO[4]
Der Veröffentlichungsstatus (z. B. Beta1).BASH_VERSINFO[5]
Der Wert von MACHTYPE
.