Următorul este ceea ce folosesc în prezent pentru testarea versiunii Debian. În loc să o fac în acest fel, îl pot face mai succint?
#!/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
Știu că nu este cel mai atractiv mod de a face acest lucru. Ceea ce vreau este să înțeleg cum se folosește fișierul la /etc/debian_version
pentru a citi numărul versiunii înainte de .
și a ignora numărul de după.
Am încercat să folosesc
if [ $(cat /etc/debian_version) == "7.*" ]; then
și am încercat și eu
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
Dar niciuna dintre acestea nu a funcționat pentru mine. Vreau să îmi demonstrez scriptul în viitor, astfel încât, dacă Debian 7.4 va fi lansat, atunci nu va trebui să revin asupra tuturor scripturilor care se bazează pe asta și să le modific
Sunt, de asemenea, conștient de lsb_release -a
afișându-mi informațiile relative, doar nu știu cum să „tăi” ceea ce vreau din asta și verific dacă este Debian 6 sau 7. Scriptul original, după cum vă puteți imagina , este destul de lung.
Orice alte postări pe care le puteți indica, ar fi apreciat și prin utilizarea metodei de „tăiere” a răspunsului pentru a secționa doar partea pe care o doresc.
Răspuns
Există multe modalități de a face ceea ce doriți. Acesta doar elimină punctul zecimal și tot ce urmează din numărul versiunii:
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
înseamnă o perioadă ( \.
) urmat de zero sau mai multe din orice caracter (.*
). Astfel, pentru sed
, expresia s/\..*//
înseamnă înlocuirea perioadei și a tuturor celor care urmează cu nimic. Rezultatul comenzii sed
este salvat în variabila de mediu VERSION
.
Cele de mai sus elimină necesitatea afirmații if / then / elif /…/ fi. Va funcționa atât cu bash, cât și cu / bin / sh obișnuit.
MORE: sed
este un editor de flux: asta înseamnă că citește liniile din stdin, le editează conform instrucțiunilor și (de obicei) le trimite la stdout. În acest caz, îi oferim o instrucțiune „înlocuitoare”. De exemplu, s/foo/bar/
înseamnă să găsiți prima apariție a foo și să o înlocuiți cu bară. Ca un caz special, s/foo//
înseamnă înlocuirea foo
cu nimic. În cazul nostru, dorim să înlocuim o perioadă urmată de orice personaj cu nimic. Acum, o perioadă este „.” cu excepția faptului că sed
tratează în mod normal o perioadă pentru a însemna „orice caracter”. Deci, trebuie să „scăpăm” de el punând o bară inversă în fața sa. Când sed
vede \.
, știe că ne referim la o perioadă literală. De asemenea, dorim să ștergem orice caracter după perioada. Pentru a reprezenta „orice caracter”, folosim un punct .
(fără evadare). Pentru a fi general, totuși, vrem să ștergem toate caracterele care urmează perioadei, indiferent de câte sunt. Deci, în timp ce în limbajul sed
„, o perioadă înseamnă orice caracter, steaua înseamnă” orice număr al caracterului precedent „(care ar putea fi zero). Astfel, perioada-stea .*
înseamnă zero sau mai mult din orice caracter. Prin urmare, punând totul împreună, s/\..*//
spune sed
că dacă găsește o perioadă, posibil urmată de ceva, atunci înlocuiește-o cu nimic.
Comentarii
Răspuns
Aici „o soluție care folosește bash, fără utilități externe , și este un singur apel
read -d . VERSION < /etc/debian_version
Aceasta citește /etc/debian_version
, împarte intrarea pe perioadă (.
), atribuie totul înainte de perioadă lui VERSION
și aruncă totul după.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
Acest lucru este ușor diferit prin faptul că salvează totul după perioada din VERSION_MINOR
IFS="." read -a VERSION < /etc/debian_version
Acesta este cel mai puternic în acest se împarte pe perioadă și se atribuie matricei $VERSION
. Dacă versiunea este 1.2.3
, atunci ${VERSION[0]} == 1
${VERSION[1]} == 2
și ${VERSION[2]} == 3
.
Comentarii
- Acest lucru este excelent!' nu am văzut niciodată citirea folosindu-se așa!
Răspuns
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
Acest lucru poate fi extins pentru a recunoaște mai multe versiuni, desigur.
s/
, dar ce zici de\..*
?\.
pur și simplu nu puteam ' să înțeleg al doilea.
. Vă mulțumesc că ați clarificat acest lucru pentru mine.