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

  • Poate fi elaborat acest răspuns pentru mine. I Înțelegeți ce înseamnă partea s/, dar ce zici de \..*?
  • @DanijelJ Am adăugat câteva explicații. Poate suprapuneți cu ceea ce știți deja, dar mi-am dat seama că este mai bine decât să lăsați în afară ceva ce nu ați ' t. Anunțați-mă dacă vă ajută.
  • Da, asta îmi explică multe. Am înțeles \. pur și simplu nu puteam ' să înțeleg al doilea .. Vă mulțumesc că ați clarificat acest lucru pentru mine.

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *