Ich muss testen, ob die Bash-Versionsnummer> = für eine bestimmte Nummer ist. Zum Beispiel habe ich:
$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Um assoziative Arrays verwenden zu können, muss die Bash-Versionsnummer> = 4 sein.
In meinem Bash-Skript möchte ich einen Einzeilentest auf die eleganteste / effizienteste / lesbarste Art und Weise durchführen, aber auch andere Ansätze werden akzeptiert.
command-line
bash
scripts
versions
WinEunuuchs2Unix
quelle
quelle
$BASH_VERSION
und angesehen$BASH_VERSINFO
?--version
und Testen der Ausgabe war die ursprüngliche Absicht. Ich habe die Frage entsprechend bearbeitet.Antworten:
Versuchen:
BASH_VERSINFO
ist eine schreibgeschützte Array-Variable, deren Mitglieder Versionsinformationen für diese Bash-Instanz enthalten. Da es mit Bash 2.0 eingeführt wurde, wird es wahrscheinlich von allen Bash-Versionen unterstützt, auf die Sie stoßen werden. Um jedoch vorsichtig zu sein, geben wir0
für alle Bash-Versionen früherer Versionen, für die diese Variable nicht festgelegt ist, den Standardwert von an .Extrahieren von Versionsinformationen aus anderen Programmen
Sie haben nach LibreOffice, Python, Kernel usw. gefragt.
LibreOffice erzeugt Versionsinformationen, die wie folgt aussehen:
So extrahieren Sie die Versionsnummer:
Für Python:
Verwenden Sie zum Abrufen der Kernelversion
uname
:quelle
uname -r
"4.9.0-2-amd64" ist, der mit einem regulären Bash-Test größer als meiner "4.11.1-041101-generic" testen könnte, wenn in Wirklichkeit meine Versionsnummer größer ist.$ python --version
dem zurückgegeben wirdPython 2.7.12
. @ wjandrea-- danke für den Link +1. Vielleicht könnte ich eine Tabelle mit allen aufgerufenen Programmnamen und minimalen Versionsnummern erstellen. Übergeben Sie die Tabelle dann an eine geänderte Kopie des vonpython
Ihnen angegebenen Links. Da nur kompiliertes Python vongrub
Ihnen aufgerufen werden kann, würde man denken, dass eine Binärdatei existiert, um dies oder das in der Shell mögliche zu tun.Anstatt Versionsnummern zu vergleichen, können Sie die Funktion selbst direkt testen.
declare -A
Gibt zurück2
(zumindest in Bash 3.2), wenn es nicht erkannt-A
wird. Testen Sie dies (es wird auch ein Fehler ausgegeben):(
declare -A var
schlägt auch fehl, wennvar
es sich um ein nicht assoziatives Array handelt, alsounset
zuerst.)Ich gehe zwar nicht wirklich davon aus, dass jemand Funktionen in Bash zurückportieren wird, aber im Allgemeinen ist es besser, nach den Funktionen zu suchen, nicht nach den Versionen. Selbst in Bashs Fall könnte jemand eine Version mit nur eingeschränkten Funktionen kompilieren ...
Der allgemeinere Fall des Testens von Versionsnummern besteht aus zwei Teilen: 1) wie man die richtige zu testende Versionsnummer findet und 2) wie man sie mit einem anderen Wert vergleicht.
Der erste ist der schwierigere. Viele Programme teilen ihre Versionsnummer mit einem Befehlszeilenflag wie
--version
oder mit-v
, aber das Ausgabeformat variiert und die programmgesteuerte Auswahl der Versionsnummer kann schwierig sein. Dann gibt es das Problem, dass möglicherweise mehrere Versionen desselben Programms gleichzeitig installiert sind.Die zweite hängt von einigen Kenntnissen über das Format der Versionsnummern ab.
dpkg
kann Versionsnummern im Debian-Stil vergleichen (die meiner Meinung nach Versionen vom Typ Semver als Teilmenge enthalten):Oder um nur das Obige zu kombinieren:
quelle
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: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 SystemDer alternative Weg ist über die case-Anweisung oder die if-Anweisung. Persönlich würde ich das tun:
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:
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 filterndpkg-query
kann auch mit etwas Filterung über nützlich seinawk
.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
oderapt
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 alsbash
.quelle
yad --version
kehrt zurück,0.37.0 (GTK+ 3.18.9)
aber neue Funktionen sind derzeit in0.39
.Einzeiler nicht möglich, aber ein Bash-Skript ist möglich
Ich habe ein Skript entwickelt, das auf Antworten in Stack Overflow basiert. Eine dieser Antworten führte dazu, dass ein Dell-Mitarbeiter 2004 Versionsnummernvergleiche für die DKMS-Anwendung schrieb.
Der Code
Das folgende Bash-Skript muss mit dem Befehl als ausführbar markiert werden
chmod a+x script-name
. Ich benutze den Namen/usr/local/bin/testver
:quelle