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
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.
s/
część, ale co z\..*
?\.
Po prostu nie mogłem ' zrozumieć drugiego.
. Dziękuję za wyjaśnienie.