Angenommen, ich möchte die gcc
Version vergleichen , um festzustellen, ob auf dem System die Mindestversion installiert ist oder nicht.
Um die gcc
Version zu überprüfen , habe ich Folgendes ausgeführt
gcc --version | head -n1 | cut -d" " -f4
Die Ausgabe war
4.8.5
Also schrieb ich eine einfache if
Anweisung, um diese Version mit einem anderen Wert zu vergleichen
if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then
echo "Less than 5.0.0"
else
echo "Greater than 5.0.0"
fi
Aber es wirft einen Fehler:
[: integer expression expected: 4.8.5
Ich habe meinen Fehler verstanden, dass ich zum Vergleichen Zeichenfolgen verwendet habe und die -lt
erforderliche Ganzzahl. Gibt es eine andere Möglichkeit, die Versionen zu vergleichen?
shell-script
test
version
numeric-data
Abhimanyu Saharan
quelle
quelle
gcc -dumpversion
Antworten:
Ich weiß nicht, ob es schön ist, aber es funktioniert für jedes mir bekannte Versionsformat.
( Hinweis: Bessere Version des Benutzers 'Wildcard': /unix//users/135943/wildcard , zusätzliche Bedingung entfernt)
quelle
printf "$requiredver\n$currentver"
mitprintf '%s\n' "$requiredver" "$currentver"
.-V
ist eine GNU-Erweiterung vonsort(1)
daher ist diese Lösung nicht portabel.sort -n
funktioniert bei numerischen Versionen fast genauso.Hier gebe ich eine Lösung zum Vergleichen von Unix-Kernel-Versionen. Und es sollte für andere wie gcc funktionieren. Ich kümmere mich nur um die ersten 2 Versionsnummern, aber Sie können eine weitere Logikebene hinzufügen. Es ist ein Liner und ich habe es zum besseren Verständnis in mehreren Zeilen geschrieben.
Sie können dies ändern und zur Überprüfung der gcc-Version verwenden.
quelle
Kürzere Version:
quelle
printf '%s\n'
ist gut genug;printf
wiederholt die Formatzeichenfolge nach Bedarf.printf
Formatzeichenfolge wiederholt wird, aber ich (die fehlende!) Syntax dafür ist meiner Meinung nach dunkel; Daher verwende ich dies nur bei Bedarf = wenn die Anzahl der Argumente groß oder variabel ist.Gutschrift geht an @Shellman
quelle
Früher haben wir viele Versionsprüfungen in einem GNU-Makefile durchgeführt. Wir haben durch die Makefile-Einrichtungen geschossen. Wir mussten alte Binutils und Buggy-Compiler erkennen und sie im Handumdrehen umgehen.
Das Muster, das wir verwendeten, war:
quelle