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
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
så ${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.
s/
delen betyr, men hva med\..*
?\.
Jeg kunne bare ikke ' t forstå det andre.
. Takk for at du avklarte dette for meg.