Følgende er hva jeg bruker for øyeblikket for å teste versjonen av Debian. I stedet for å gjøre det på denne måten, kan jeg gjøre det mer 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 vet at det ikke er den mest attraktive måten å gjøre dette på. Det jeg vil, er å forstå hvordan du bruker filen på /etc/debian_version for å lese versjonsnummeret før . og ignorere tallet etter.

Jeg prøvde å bruke

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

og jeg prøvde også

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

Men ingen av disse fungerte for meg. Jeg vil fremtidssikre skriptet mitt slik at hvis Debian 7.4 blir utgitt, så trenger jeg ikke å gå tilbake over alle skriptene som er avhengige av dette og endre dem

Jeg er også klar over lsb_release -a viser meg den relative informasjonen, jeg vet bare ikke hvordan jeg skal «klippe» det jeg vil ha fra det og sjekke at det er Debian 6 eller 7. Det originale skriptet, som du kan forestille deg , er ganske langvarig.

Alle andre innlegg du kan peke meg på, vil også bli satt pris på ved å bruke metoden for å «skjære» fra hverandre svaret på bare å dele ut den delen jeg vil ha.

Svar

Det er mange måter å gjøre det du vil. Denne fjerner bare desimaltegnet og alt etter fra versjonsnummeret:

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

\..* betyr en periode ( \.) etterfulgt av null eller flere av hvilket som helst tegn (.*). For sed betyr uttrykket s/\..*// således å erstatte perioden og alt som følger med ingenting. Resultatet av sed -kommandoen lagres i miljøvariabelen VERSION.

Ovennevnte eliminerer behovet for if / then / elif /…/ fi uttalelser. Det fungerer både med bash og vanlig / bin / sh.

MER: sed er en streameditor: det betyr at den leser linjer fra stdin, redigerer dem i henhold til instruksjonene, og (vanligvis) sender dem til stdout. I dette tilfellet gir vi det en «erstatning» -instruksjon. For eksempel betyr s/foo/bar/ å finne den første forekomsten av foo og erstatte den med bar. Som et spesielt tilfelle betyr s/foo// å erstatte foo med ingenting. I vårt tilfelle ønsker vi å erstatte en periode etterfulgt av enhver karakter med ingenting. Nå er en periode «.» bortsett fra at sed normalt behandler en periode for å bety «hvilket som helst tegn». Så vi trenger å «unnslippe» det ved å sette en tilbakeslag foran den. Når sed ser \., vet det at vi mener en bokstavelig periode. Vi vil også slette tegn som følger etter perioden. For å representere «hvilket som helst tegn» bruker vi en periode . (ingen flukt). For å være generell vil vi imidlertid slette alle tegnene etter perioden, uavhengig av hvor mange det er. Så mens i sed «s språk, betyr en periode hvilket som helst tegn, stjernen betyr» hvilket som helst tall av forrige tegn «(som kan være null). Dermed periodestjerne .* betyr null eller flere av hvilket som helst tegn. Så når du legger alt sammen, forteller s/\..*// sed at hvis den finner en periode, muligens etterfulgt av noe, så erstatt den med ingenting.

Kommentarer

  • Kan dette svaret utdypes for meg. Jeg forstå hva s/ delen betyr, men hva med \..*?
  • @DanijelJ Jeg la til noen forklaringer. Det kan hende overlapper med det du allerede vet, men jeg skjønte at det var bedre enn å utelate noe du ikke ' t. Gi meg beskjed hvis det hjelper.
  • Ja, det forklarer mye for meg. Jeg forsto \. Jeg kunne bare ikke ' t forstå det andre .. Takk for at du avklarte dette for meg.

Svar

Her «er en løsning som bruker bash, ingen eksterne verktøy , og er en enkelt samtale

read -d . VERSION < /etc/debian_version 

Dette lyder /etc/debian_version, deler inngangen på perioden (.), tildeler alt før perioden til VERSION og forkaster alt etter.


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

Dette er litt annerledes ved at det lagrer alt etter perioden i VERSION_MINOR


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

Denne er den kraftigste i den den deles på perioden, og tildeles til matrisen $VERSION. Hvis versjonen er 1.2.3${VERSION[0]} == 1 ${VERSION[1]} == 2 og ${VERSION[2]} == 3.

Kommentarer

  • Dette er utmerket!Jeg ' har aldri sett lesing brukt slik!

Svar

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

Dette kan selvfølgelig utvides til å gjenkjenne flere versjoner.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *