Följande är vad jag för närvarande använder för att testa versionen av Debian. Istället för att göra det kan jag göra det mer kortfattat?
#!/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
Jag vet att det inte är det mest attraktiva sättet att göra detta. Vad jag vill är att förstå hur man använder filen på /etc/debian_version
för att läsa versionsnumret före .
och ignorera numret efter.
Jag försökte använda
if [ $(cat /etc/debian_version) == "7.*" ]; then
och jag försökte också
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
Men inget av dessa fungerade för mig. Jag vill framtidssäkra mitt skript så att om Debian 7.4 släpps, så behöver jag inte gå tillbaka över alla skript som är beroende av detta och ändra dem
Jag är också medveten om lsb_release -a
visar mig den relativa informationen, jag vet bara inte hur jag ska ”klippa” det jag vill ha av det och kontrollera att det är Debian 6 eller 7. Originalskriptet, som du kan föreställa dig , är ganska lång.
Alla andra inlägg som du kan peka på mig skulle också uppskattas genom att använda metoden för att ”klippa” ifrån sig svaret på att bara dela ut den del som jag vill ha.
Svar
Det finns många sätt att göra vad du vill. Den här tar bara bort decimalpunkten och allt efter från versionsnumret:
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
betyder en punkt ( \.
) följt av noll eller fler av vilket tecken som helst (.*
). För sed
betyder uttrycket s/\..*//
därför att ersätta perioden och allt som följer med ingenting. Resultatet av kommandot sed
sparas i miljövariabeln VERSION
.
Ovanstående eliminerar behovet av if / then / elif /…/ fi uttalanden. Det fungerar både med bash och vanligt / bin / sh.
MER: sed
är en strömredigerare: det betyder att den läser rader från stdin, redigerar dem enligt instruktionerna och (vanligtvis) skickar dem till stdout. I det här fallet ger vi det en ”ersättningsinstruktion”. Till exempel betyder s/foo/bar/
att hitta den första förekomsten av foo och ersätta den med stapel. Som ett specialfall betyder s/foo//
att ersätta foo
med ingenting. I vårt fall vill vi ersätta en period följt av vilken karaktär som helst med ingenting. Nu är en period ”.” förutom att sed
normalt behandlar en period för att betyda ”vilket tecken som helst”. Så vi måste ”undkomma” det genom att sätta en backslash framför det. När sed
ser \.
vet den att vi menar en bokstavlig period. Vi vill också radera alla tecken efter perioden. För att representera ”vilken karaktär som helst” använder vi en period .
(ingen flykt). För att vara allmänt vill vi dock ta bort alla tecken efter perioden, oavsett hur många det finns. Medan i sed
”språk betyder en period vilken karaktär som helst, stjärnan betyder” valfritt nummer av föregående tecken ”(vilket kan vara noll). Således periodstjärna .*
betyder noll eller mer av vilket tecken som helst. Så att sätta ihop allt säger s/\..*//
sed
att om den hittar en period, eventuellt följt av någonting, byt den ut mot ingenting.
Kommentarer
Svar
Här är en lösning som använder bash, inga externa verktyg , och är ett enda samtal
read -d . VERSION < /etc/debian_version
Detta läser /etc/debian_version
, delar ingången på perioden (.
), tilldelar allt före perioden till VERSION
och slänger allt efter.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
Detta är något annorlunda genom att det sparar allt efter perioden i VERSION_MINOR
IFS="." read -a VERSION < /etc/debian_version
Den här är den mest kraftfulla i det den delas upp på perioden och tilldelas matrisen $VERSION
. Om versionen är 1.2.3
då ${VERSION[0]} == 1
${VERSION[1]} == 2
och ${VERSION[2]} == 3
.
Kommentarer
- Det här är utmärkt!Jag ' har aldrig sett läsningar används så här!
Svar
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
Detta kan naturligtvis utökas för att känna igen fler versioner.
s/
delen betyder, men hur är det med\..*
?\.
Jag kunde bara inte ' t förstå den andra.
. Tack för att du klargjorde detta för mig.