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
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.
s/
rész, de mi van a\..*
-vel?\.
-t, csak nem tudtam ' megérteni a második.
. Köszönöm, hogy tisztázta ezt nekem.