Załóżmy, że chcę porównać gcc
wersję, aby zobaczyć, czy system ma zainstalowaną wersję minimalną, czy nie.
Aby sprawdzić gcc
wersję, wykonałem następujące czynności
gcc --version | head -n1 | cut -d" " -f4
Wynik był
4.8.5
Napisałem więc proste if
stwierdzenie, aby sprawdzić tę wersję pod kątem innej wartości
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
Ale generuje błąd:
[: integer expression expected: 4.8.5
Zrozumiałem swój błąd polegający na tym, że do porównywania używałem łańcuchów i -lt
wymaga liczby całkowitej. Czy jest jakiś inny sposób na porównanie wersji?
shell-script
test
version
numeric-data
Abhimanyu Saharan
źródło
źródło
gcc -dumpversion
Odpowiedzi:
Nie wiem, czy jest piękny, ale działa z każdym znanym formatem wersji.
( Uwaga: lepsza wersja użytkownika „wildcard”: https://unix.stackexchange.com/users/135943/wildcard , usunięto dodatkowy warunek)
źródło
printf "$requiredver\n$currentver"
zprintf '%s\n' "$requiredver" "$currentver"
.-V
jest rozszerzeniem GNU,sort(1)
dlatego to rozwiązanie nie jest przenośne.sort -n
działa prawie tak samo w przypadku wersji liczbowych.Tutaj podam rozwiązanie do porównywania wersji jądra Unixa. I powinno działać dla innych, takich jak gcc. Zależy mi tylko na dwóch pierwszych numerach wersji, ale możesz dodać kolejną warstwę logiki. Jest to jedna linijka i dla zrozumienia napisałem ją w wielu wierszach.
Możesz to zmodyfikować i użyć do sprawdzania wersji gcc.
źródło
Często sprawdzaliśmy wersję w pliku maku GNU. Uciekliśmy przez obiekty makefile. Musieliśmy wykryć stare Binutils i błędne kompilatory i obejść je w locie.
Zastosowaliśmy wzór:
źródło
Krótsza wersja:
źródło
printf '%s\n'
jest wystarczająco dobry;printf
powtórzy ciąg formatu w razie potrzeby.printf
powtarza ciąg formatu, ale ja składnia (brak!) Jest dla tego niejasna; więc używam tego tylko wtedy, gdy jest to wymagane = gdy liczba argumentów jest duża lub zmienna.Kredyt trafia do @Shellman
źródło