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

  • Kan detta svar utarbetas för mig. Jag förstå vad s/ delen betyder, men hur är det med \..*?
  • @DanijelJ Jag lade till en förklaring. Det kanske överlappar med vad du redan vet men jag tänkte att det var bättre än att utelämna något som du inte ' t. Låt mig veta om det hjälper.
  • Ja, det förklarar mycket för mig. Jag förstod \. Jag kunde bara inte ' t förstå den andra .. Tack för att du klargjorde detta för mig.

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${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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *