A következőket használom jelenleg a Debian verziójának teszteléséhez. így tudok tömörebbé tenni?

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

Tudom, hogy ez nem a legvonzóbb módszer erre. Azt akarom, hogy megértsem, hogyan kell használni a /etc/debian_version címen található fájlt a . előtti verziószám elolvasására és az azt követő szám figyelmen kívül hagyására.

Próbáltam használni a

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

-t, és kipróbáltam a

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

De ezek sem működtek nálam. Szeretném a jövőben igazolni a szkriptemet, hogy ha a Debian 7.4 kiadásra kerül, akkor nem kell visszamennem az összes erre támaszkodó szkriptre és módosítanom őket.

Ismerem a lsb_release -a megmutatva nekem a relatív információkat, csak nem tudom, hogyan “vágjam le” ebből a célt, és ellenőrizzem, hogy ez Debian 6 vagy 7. Az eredeti szkript, ahogy el tudod képzelni , meglehetősen hosszadalmas.

Bármely más hozzászólás, amelyre rám tud mutatni, szintén értékelhető lenne, ha a választ “elvágná” módszerrel csak azt a részt választaná ki, amelyet szeretnék.

Válasz

Sokféleképpen teheti meg, amit akar. Ez csak eltávolítja a tizedespontot és minden utána következőt a verziószámból:

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

\..* pontot jelent ( \.), amelyet nulla vagy annál több karakter követ (.*). Így a sed esetében az s/\..*// kifejezés azt jelenti, hogy a periódust és mindazt, ami következik, kicserélik a semmire. A sed parancs eredményét az VERSION környezeti változó menti.

A fentiek miatt nincs szükség a if / then / elif /…/ fi állítások. Ez mind a bash, mind a hétköznapi / bin / sh fájlokkal együtt fog működni.

TÖBB: sed egy adatfolyam-szerkesztő: ez azt jelenti, hogy beolvassa a stdin sorait, szerkeszti őket az utasításoknak megfelelően, és (általában) elküldi őket az stdout-nak. Ebben az esetben “helyettesítő” utasítást adunk neki. Például a s/foo/bar/ azt jelenti, hogy megtalálja a foo első előfordulását, és helyettesíti azt bárral. Különleges esetként a s/foo// azt jelenti, hogy a foo szöveget semmivel sem helyettesíti. Esetünkben a bármely karakter által követett periódust a semmivel akarjuk helyettesíteni. Most egy periódus “”. kivéve, hogy sed a periódust általában úgy értelmezi, hogy “bármilyen karakter”. Tehát úgy kell “elmenekülnünk”, hogy egy visszavágót helyezünk elé. Amikor sed meglátja \., akkor tudja, hogy szó szerinti periódust értünk. Ezenkívül törölni akarunk minden karaktert a periódus után. A “bármely karakter” ábrázolásához használunk egy pontot . (nincs menekvés). Általánosságban elmondható, hogy az időszakot követő összes karaktert törölni akarjuk, függetlenül attól, hogy hány van. Tehát, míg a sed “nyelvben a periódus bármilyen karaktert jelent, a csillag” az előző karakter tetszőleges számát “jelenti (ami nulla lehet). Az id = “6f169f1965″>

bármely karaktert nulla vagy annál többet jelent. Tehát az egészet összerakva s/\..*// elmondja sed hogy ha talál egy periódust, amelyet esetleg bármi követ, akkor cserélje le semmire.

Megjegyzések

  • Kifejthető-e számomra ez a válasz. megérteni, mit jelent a s/ rész, de mi van a \..* -vel?
  • @DanijelJ adtam néhány magyarázatot. Lehet, hogy átfedésben van azzal, amit már tud, de rájöttem, hogy ez jobb, mint kihagyni valamit, amit nem ' t tett. Tudassa velem, ha segít.
  • Igen, ez sok mindent megmagyaráz nekem. Megértettem a \. -t, csak nem tudtam ' megérteni a második .. Köszönöm, hogy tisztázta ezt nekem.

Válasz

Itt egy olyan megoldás, amely bash-t használ, külső segédprogramok nélkül. , és egyetlen hívás

read -d . VERSION < /etc/debian_version 

Ez így olvasható: /etc/debian_version, felosztja a bemenetet a periódusra (.), az időszakot megelőzően mindent hozzárendel VERSION -hez, és utána mindent elvet.


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

Ez kissé különbözik attól, hogy mindent elment a VERSION_MINOR szakaszban szereplő időszak után.


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

Ez a legerősebb ebben felosztja a periódusra, és hozzárendeli a $VERSION tömbhöz. Ha a verzió 1.2.3, akkor ${VERSION[0]} == 1 ${VERSION[1]} == 2 és ${VERSION[2]} == 3.

Megjegyzések

  • Ez kiváló!<

még soha nem láttam, hogy az olvasottakat így használják!

Válasz

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

Ez természetesen kibővíthető további verziók felismerésére.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük