Následující text aktuálně používám k testování verze Debianu. Místo toho Tímto způsobem mohu učinit výstižnější?
#!/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
Vím, že to není nejatraktivnější způsob, jak toho dosáhnout. To, co chci, je pochopit, jak používat soubor na /etc/debian_version
ke čtení čísla verze před .
a číslo po něm ignorovat.
Zkoušel jsem použít
if [ $(cat /etc/debian_version) == "7.*" ]; then
a také jsem zkusil
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
Ale ani jeden z nich pro mě nepracoval. Chci do budoucna ověřit svůj skript, takže pokud vyjde Debian 7.4, nebudu se muset vracet přes všechny skripty, které se na to spoléhají, a měnit je.
Jsem si také vědom lsb_release -a
zobrazující relativní informace, nevím, jak z toho „vystřihnout“, co chci, a zkontrolovat, zda je to Debian 6 nebo 7. Původní skript, jak si dokážete představit , je docela zdlouhavé.
Jakékoli další příspěvky, na které mě můžete odkázat, by byly také oceněny použitím metody „odříznutí“ oddělování odpovědi pouze na část, kterou chci.
Odpověď
Existuje mnoho způsobů, jak dělat, co chcete. Tento odstraní z čísla verze desetinnou čárku a vše poté:
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
znamená tečku ( \.
) následovaný nulou nebo více libovolnými znaky (.*
). U sed
tedy výraz s/\..*//
znamená nahradit období a vše, co následuje, ničím. Výsledek příkazu sed
se uloží do proměnné prostředí VERSION
.
Výše uvedené eliminuje potřebu if / then / elif /…/ fi prohlášení. Bude fungovat s bash i obyčejným / bin / sh.
VÍCE: sed
je editor streamů: to znamená, že čte řádky ze stdin, upravuje je podle pokynů a (obvykle) je odesílá do stdout. V tomto případě mu dáváme „náhradní“ instrukci. Například s/foo/bar/
znamená najít první výskyt foo a nahradit jej barem. Ve zvláštním případě znamená s/foo//
nahradit foo
ničím. V našem případě chceme nahradit období, za nímž následuje jakýkoli znak, ničím. Tečka je nyní „.“ kromě toho, že sed
normálně považuje období za „jakýkoli znak“. Musíme tomu tedy „uniknout“ tím, že před něj postavíme zpětné lomítko. Když sed
uvidí \.
, ví, že máme na mysli doslovné období. Chceme také vymazat všechny znaky následující po období. K reprezentaci „libovolného znaku“ používáme tečku .
(bez úniku). Abychom byli obecně, chceme odstranit všechny znaky následující po období, bez ohledu na to, kolik jich je. Zatímco v jazyce sed
„tečka znamená jakýkoli znak, hvězda znamená“ libovolné číslo předchozího znaku „(které může být nula). id = „6f169f1965″>
znamená nula nebo více libovolného znaku. Když to tedy vše shrneme, s/\..*//
řekne sed
že pokud najde tečku, po níž může následovat cokoli, pak ji nahraďte ničím.
Komentáře
Odpovědět
Zde je řešení, které používá bash, žádné externí nástroje , a je to jediné volání
read -d . VERSION < /etc/debian_version
Tím se přečte /etc/debian_version
, rozdělí se vstup na tečku (.
), přiřadí vše před obdobím VERSION
a vše poté zahodí.
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
Toto se mírně liší v tom, že se po období ve VERSION_MINOR uloží vše
IFS="." read -a VERSION < /etc/debian_version
Toto je v tomto rozděluje se na období a přiřadí se k poli $VERSION
. Pokud je verze 1.2.3
pak ${VERSION[0]} == 1
${VERSION[1]} == 2
a ${VERSION[2]} == 3
.
Komentáře
- To je vynikající!Takto jsem ' nikdy neviděl čtení použité!
Odpovědět
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
Tuto možnost lze samozřejmě rozšířit tak, aby rozpoznala více verzí.
s/
část, ale co\..*
?\.
prostě jsem nemohl ' nerozumět druhému.
. Děkuji, že jste mi to objasnili.