Poniżej znajduje się opis tego, czego obecnie używam do testowania wersji Debiana. Zamiast to robić w ten sposób czy mogę uczynić to bardziej zwięzłym?

#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == "7.3" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.2" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.1" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.0" ]; then VERSION=7 fi 

Wiem, że to nie jest najbardziej atrakcyjny sposób zrobienia tego. Chcę zrozumieć, jak używać pliku pod adresem /etc/debian_version do odczytania numeru wersji przed . i zignorować numer po nim.

Próbowałem użyć

if [ $(cat /etc/debian_version) == "7.*" ]; then 

, a także

if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then 

Ale żaden z nich nie działał dla mnie. Chcę w przyszłości zabezpieczyć mój skrypt, aby po wydaniu Debiana 7.4 nie musiałem przeglądać wszystkich skryptów, które na tym polegają i je zmieniać.

Jestem również świadomy lsb_release -a pokazując mi względne informacje, po prostu nie wiem jak „wyciąć” z tego to, czego chcę i sprawdzić, czy to Debian 6 lub 7. Oryginalny skrypt, jak możesz sobie wyobrazić , jest dość długi.

Wszelkie inne posty, na które możesz mi wskazać, byłyby również wdzięczne za użycie metody „odcinania” odpowiedzi, aby wyodrębnić tylko tę część, którą chcę.

Odpowiedź

Jest wiele sposobów na zrobienie tego, co chcesz. Ten po prostu usuwa przecinek dziesiętny i wszystko po nim z numeru wersji:

VERSION=$(sed "s/\..*//" /etc/debian_version) 

\..* oznacza kropkę ( \.), po którym następuje zero lub więcej dowolnego znaku (.*). Dlatego dla sed wyrażenie s/\..*// oznacza zastąpienie kropki i wszystkiego, co następuje po niej niczym. Wynik polecenia sed jest zapisywany w zmiennej środowiskowej VERSION.

Powyższe eliminuje potrzebę if / then / elif /…/ fi. Będzie działać zarówno z bash, jak i zwykłym / bin / sh.

WIĘCEJ: sed to edytor strumieniowy: oznacza to, że czyta wiersze ze standardowego wejścia, edytuje je zgodnie z instrukcjami i (zazwyczaj) wysyła je na standardowe wyjście. W tym przypadku dajemy mu instrukcję „zastępczą”. Na przykład s/foo/bar/ oznacza znalezienie pierwszego wystąpienia foo i zastąpienie go bar. W specjalnym przypadku s/foo// oznacza zastąpienie foo niczym. W naszym przypadku chcemy zastąpić kropkę, po której następuje dowolny znak, niczym. Teraz kropka to „”. poza tym, że sed zwykle traktuje kropkę jako „dowolny znak”. Musimy więc „uciec” od tego, wstawiając przed nim ukośnik odwrotny. Kiedy sed widzi \., wie, że mamy na myśli dosłowny okres. Chcemy również usunąć wszystkie znaki następujące po kropce. Aby przedstawić „dowolny znak”, używamy kropki . (bez zmiany znaczenia). Jednak ogólnie rzecz biorąc, chcemy usunąć wszystkie znaki następujące po kropce, niezależnie od tego, ile ich jest. Tak więc, podczas gdy w języku sed „kropka oznacza dowolny znak, gwiazda oznacza” dowolną liczbę poprzedzającego znaku „(która może wynosić zero). Zatem kropka oznacza dowolny znak id = „6f169f1965″>

oznacza zero lub więcej dowolnego znaku. A więc łącząc to wszystko razem, s/\..*// mówi sed że jeśli znajdzie kropkę, po której prawdopodobnie nastąpi cokolwiek, zastąp ją niczym.

Komentarze

  • Czy można uściślić dla mnie tę odpowiedź? rozumiesz, co oznacza s/ część, ale co z \..*?
  • @DanijelJ Dodałem wyjaśnienie. Może pokrywają się z tym, co już wiesz, ale doszedłem do wniosku, że to lepsze niż pomijanie czegoś, czego nie zrobiłeś ' t. Daj mi znać, jeśli to pomoże.
  • Tak, to wiele dla mnie wyjaśnia. Zrozumiałem \. Po prostu nie mogłem ' zrozumieć drugiego .. Dziękuję za wyjaśnienie.

Odpowiedź

Oto rozwiązanie, które używa bash, bez zewnętrznych narzędzi i jest pojedynczym wywołaniem

read -d . VERSION < /etc/debian_version 

To czyta /etc/debian_version, dzieli dane wejściowe na kropkę (.), przypisuje wszystko przed kropką do VERSION i odrzuca wszystko później.


IFS="." read VERSION VERSION_MINOR < /etc/debian_version 

Jest to nieco inne, ponieważ zapisuje wszystko po okresie w VERSION_MINOR


IFS="." read -a VERSION < /etc/debian_version 

Ten jest najpotężniejszy pod tym dzieli się na kropkę i przypisuje do tablicy $VERSION. Jeśli wersja to 1.2.3, to ${VERSION[0]} == 1 ${VERSION[1]} == 2 i ${VERSION[2]} == 3.

Komentarze

  • To jest doskonałe!' nigdy nie widziałem, aby czytać używano w ten sposób!

Odpowiedź

case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac 

Można to oczywiście rozszerzyć, aby rozpoznawać więcej wersji.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *