Det følgende er, hvad jeg bruger i øjeblikket til at teste versionen af Debian. I stedet for at gøre det kan jeg gøre det mere kortfattet?

#!/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 

Jeg ved, det er ikke den mest attraktive måde at gøre dette på. Hvad jeg vil, er at forstå, hvordan man bruger filen på /etc/debian_version til at læse versionsnummeret før . og ignorere nummeret efter.

Jeg prøvede at bruge

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

og jeg prøvede også

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

Men ingen af disse fungerede for mig. Jeg vil fremtidssikre mit script, så hvis Debian 7.4 bliver frigivet, så bliver jeg ikke nødt til at gå tilbage over alle de scripts, der er afhængige af dette og ændre dem

Jeg er også opmærksom på lsb_release -a viser mig de relative oplysninger, jeg ved bare ikke, hvordan man “klipper”, hvad jeg vil have ud af det, og kontrollerer, at det er Debian 6 eller 7. Det originale script, som du kan forestille dig , er ret langvarig.

Alle andre indlæg, du kan henvise mig til, ville også blive værdsat ved at bruge metoden til at “skære” svaret ud for kun at uddele den del, jeg ønsker.

Svar

Der er mange måder at gøre, hvad du vil. Denne fjerner bare decimaltegnet og alt efter fra versionsnummeret:

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

\..* betyder en periode ( \.) efterfulgt af nul eller flere af ethvert tegn (.*). For sed betyder udtrykket s/\..*// således at erstatte perioden og alt der følger med intet. Resultatet af kommandoen sed gemmes i miljøvariablen VERSION.

Ovenstående eliminerer behovet for if / then / elif /…/ fi udsagn. Det fungerer med både bash og almindeligt / bin / sh.

MERE: sed er en streameditor: det betyder, at den læser linjer fra stdin, redigerer dem som beskrevet i instruktionerne og (typisk) sender dem til stdout. I dette tilfælde giver vi det en “erstatning” instruktion. For eksempel betyder s/foo/bar/ at finde den første forekomst af foo og erstatte den med bar. Som et specielt tilfælde betyder s/foo// at erstatte foo med intet. I vores tilfælde ønsker vi at erstatte en periode efterfulgt af enhver karakter med intet. Nu er en periode “.” bortset fra at sed normalt behandler en periode for at betyde “ethvert tegn”. Så vi er nødt til at “undslippe” det ved at sætte en tilbageslag foran det. Når sed ser \., ved det, at vi mener en bogstavelig periode. Vi vil også slette tegn, der følger efter perioden. For at repræsentere “ethvert tegn” bruger vi en periode . (ingen flugt). For at være generel ønsker vi dog at slette alle tegnene efter perioden, uanset hvor mange der er. Så mens på sed “s sprog betyder en periode ethvert tegn, stjernen betyder” et hvilket som helst nummer af det foregående tegn “(som kan være nul). Således periodestjerner .* betyder nul eller flere af et hvilket som helst tegn. Så når du sætter det hele sammen, fortæller s/\..*// sed at hvis den finder en periode, muligvis efterfulgt af noget, skal du erstatte den med intet.

Kommentarer

  • Kan dette svar uddybes for mig. Jeg forstå hvad s/ delen betyder, men hvad med \..*?
  • @DanijelJ Jeg tilføjede nogle forklaringer. Det kan være overlap med det, du allerede ved, men jeg regnede med, at det var bedre end at udelade noget, som du ikke ' t. Lad mig vide, hvis det hjælper.
  • Ja, det forklarer meget for mig. Jeg forstod \. Jeg kunne bare ikke ' t forstå det andet .. Tak fordi du har afklaret dette for mig.

Svar

Her er en løsning, der bruger bash, ingen eksterne hjælpeprogrammer , og er et enkelt opkald

read -d . VERSION < /etc/debian_version 

Dette lyder /etc/debian_version, opdeler input på perioden (.), tildeler alt inden perioden til VERSION og kasserer alt efter.


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

Dette er lidt anderledes, fordi det gemmer alt efter perioden i VERSION_MINOR


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

Denne er den mest magtfulde i det den opdeles på perioden og tildeles til arrayet $VERSION. Hvis versionen er 1.2.3${VERSION[0]} == 1 ${VERSION[1]} == 2 og ${VERSION[2]} == 3.

Kommentarer

  • Dette er fremragende!Jeg ' har aldrig set læse brugt som denne!

Svar

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

Dette kan selvfølgelig udvides til at genkende flere versioner.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *