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

  • Může být tato odpověď pro mě zpracována. I pochopit, co znamená s/ část, ale co \..*?
  • @DanijelJ přidal jsem nějaké vysvětlení. Možná překrývají s tím, co už víte, ale domníval jsem se, že to bylo lepší než vynechat něco, co jste ' t. Dejte mi vědět, jestli to pomůže.
  • Ano, to mi hodně vysvětluje. Rozuměl jsem \. prostě jsem nemohl ' nerozumět druhému .. Děkuji, že jste mi to objasnili.

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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *