Wie kann ich Bash >=4.0 erkennen?

Wie kann ich Bash >=4.0 erkennen?

Ich schreibe ein Skript, das verwendet read -i, 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 mitgelieferte Version aktualisieren werden.

Daher möchte ich, dass mein Skript erkennt, ob Bash neu genug ist, und mit einer hilfreichen Fehlermeldung beendet wird, die den Benutzer zum Upgrade anweist.

Ich weiß, dass ich vergleichen kann ${BASH_VERSION}, aber das ist eine Zeichenfolge mit einem nicht numerischen, möglicherweise unzuverlässigen Format. Es fühlt sich unsicher an, Annahmen darüber zu treffen.

Wie lässt sich dies am besten 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
}

Antwort1

if ((BASH_VERSINFO >= 4)); then ...

Beachten Sie, dass es BASH_VERSINFOsich um ein Array handelt. Wie bei jedem Array in Bash bezieht sich die Verwendung als einfache Variable auf das 0. Element. Sie können auch verwenden, ((BASH_VERSINFO[0] >= 4))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. Den Array-Mitgliedern werden folgende Werte zugewiesen:

BASH_VERSINFO[0] Die Hauptversionsnummer (die Version).
BASH_VERSINFO[1] Die Nebenversionsnummer (die Version).
BASH_VERSINFO[2] Der Patch-Level.
BASH_VERSINFO[3] Die Build-Version.
BASH_VERSINFO[4] Der Versionsstatus (z. B. Beta1).
BASH_VERSINFO[5] Der Wert von MACHTYPE.

verwandte Informationen