Průvodce pro začátečníky k BASH - podmínky a proměnné

Úvod

Vítejte ve třetí části "Průvodce pro začátečníky do BASH". Pokud jste vynechali předchozí dva články, pravděpodobně budete chtít vědět, co dělá tento průvodce odlišný od ostatních příruček skriptů BASH.

Tato příručka je napsána úplným nováčkem pro BASH a jako čtenář, který se učíte, když se učím. Zatímco jsem nováček na BASH, přicházím z prostředí vývojového softwaru, i když většina věcí, které jsem napsal, byla pro platformu Windows.

Prvních dva průvodci si můžete prohlédnout:

Pokud jste noví k BASH skriptování doporučuji číst první dva průvodci, než pokračovat s tímto.

V této příručce budu zdůrazňovat, jak používat podmíněné příkazy pro testování vstupů uživatele a pro kontrolu fungování skriptu.

Nainstalujte rsstail

Chcete-li se řídit touto příručkou, musíte nainstalovat aplikaci příkazového řádku nazvanou rsstail, která se používá k čtení RSS kanálů .

Pokud používáte typ distribuce na bázi Debianu / Ubuntu / Mint, postupujte takto:

sudo apt-get nainstalovat rsstail

Pro Fedora / CentOS atd. Zadejte následující:

instalovat rsstail

Pro typ openSUSE postupujte takto:

zypper install rsstail

Příkaz IF

Otevřete terminál a vytvořte soubor s názvem rssget.sh zadáním následujícího:

sudo nano rssget.sh

V editoru nano zadejte následující text:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Soubor uložte stisknutím kláves CTRL a O a ukončete klávesy CTRL a X.

Spusťte skript zadáním následujícího:

sh rssget.sh

Skript vrátí seznam titulů z RSS kanálu linux.about.com.

Nejedná se o příliš užitečný skript, protože právě načte tituly z jednoho RSS kanálu, ale ušetří zapamatování si cesty k RSS kanálu Linux.about.com.

Otevřete znovu skript rssget.sh v programu nano a upravte soubor takto:

#! / bin / bash

pokud [$ 1 = "verbose"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Spusťte skript znovu zadáním následujícího:

sh rssget.sh verbose

Tentokrát se zdroj RSS vrátí s názvem, odkazem a popisem.

Pojďme analyzovat scénář trochu podrobně:

#! / Bin / bash se objeví v každém psaném skriptu. Následující řádek se v podstatě podívá na první vstupní parametr poskytnutý uživatelem a porovná jej se slovem "verbose". Pokud se vstupní parametr a slovo "verbose" shodují s čarou mezi řádky a fází .

Výše uvedený skript je zjevně chybný. Co se stane, pokud vůbec neposkytnete vstupní parametr? Odpověď zní, že dostanete chybu v podobě neočekávaného operátora.

Druhou hlavní vadu je to, že pokud neposkytnete slovo "verbose", vůbec se nic nestane. V ideálním případě, pokud neposkytnete slovo verbose, skript by vrátil seznam titulů.

Použijte nano znovu k úpravě souboru rssget.sh a změňte kód následujícím způsobem:

#! / bin / bash

pokud [$ 1 = "verbose"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Uložte soubor a spusťte jej zadáním následujícího:

sh rssget.sh verbose

Zobrazí se seznam titulů, popisů a odkazů. Nyní ji spusťte znovu následujícím způsobem:

sh rssget.sh tituly

Tentokrát se zobrazí pouze seznam titulů.

Extra část skriptu je na řádku 4 a zavádí příkaz else . Skript v podstatě říká, že pokud je prvním parametrem slovo "podrobnější", dostanete popis, odkazy a tituly pro RSS kanál, ale pokud první parametr je něco jiného, ​​dostanete seznam titulů.

Skript se mírně zlepšil, ale stále je chybný. Pokud se nezdaří zadat parametr, přesto se zobrazí chyba. Dokonce i když uvedete parametr, jen tím, že řeknete, že nechcete, aby byl podrobný, neznamená, že chcete pouze tituly. Pravděpodobně jste právě napsali verbose špatně nebo jste možná napsali holuby, což je samozřejmě bezvýznamné.

Než se pokusíme tyto problémy vyřešit, chci vám ukázat ještě jeden příkaz, který jde s příkazem IF.

Upravte svůj skript rssget.sh tak, aby vypadal takto:

#! / bin / bash

pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "popis"]
pak
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Rozhodla jsem se, že se zbavím tohoto slova slovem a nahradím ho všemi. To není důležitá součást. Skript uvedený výše uvádí elif, který je krátký způsob, jak říkat ELSE IF.

Nyní skript funguje následovně. Pokud spustíte sh rssget.sh, pak získáte popisy, odkazy a názvy. Pokud místo toho právě spustíte sh rssget.sh popis , získáte tituly a popisy. Pokud dodáte jiné slovo, dostanete seznam titulů.

To představuje způsob, jak rychle přicházet se seznamem podmíněných prohlášení. Alternativní způsob, jak dělat ELIF, je použít to, co je známo jako vnořené IF příkazy.

Následující příklad ukazuje, jak fungují vnořené příkazy IF:

#! / bin / bash

pokud [$ 2 = "aboutdotcom"]
pak
pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "popis"]
pak
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
jiný
pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "popis"]
pak
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Neváhejte zadat vše, co se vám líbí, nebo jej zkopírujte a vložte do souboru rssget.sh.

Ve výše uvedeném skriptu je uveden druhý parametr, který vám umožňuje zvolit buď "about.com" nebo "lxer.com" jako zdroj RSS.

Chcete-li jej spustit, zadejte následující:

sh rssget.sh vše o dotcom

nebo

sh rssget.sh všechny lxer

Můžete samozřejmě nahradit všechny s popisy nebo tituly poskytnout jen popisy nebo jen tituly.

V podstatě výše uvedený kód říká, že pokud je druhý parametr aboutdotcom, podívejte se na druhý příkaz if, který je stejný jako předchozí skript, pokud je druhý parametr lxer, pak se znovu podívejte na vnitřní příkaz if se rozhodne, zda se zobrazí tituly, popisy nebo všechno.

Tento skript je poskytován výhradně jako příklad vnořeného příkazu IF a existuje tolik věcí, které jsou v tomto skriptu špatné, že by trvalo další článek, který by jim vysvětlil všechny. Hlavní problém spočívá v tom, že není škálovatelný.

Představte si, že jste chtěli přidat další RSS kanál, např. Everyday Linux User nebo Linux Today? Skript by se stal obrovským a pokud jste se rozhodli, že chcete, aby se změnil vnitřní výkaz IF, musíte ho změnit na několika místech.

Zatímco tam je čas a místo pro vnořené IF by měly být používány mírně. Obvykle existuje způsob, jak refactor kód, takže nepotřebujete vnořené IF vůbec. Budu se k tomuto tématu připojit v budoucím článku.

Podívejme se nyní na to, jak řešit problém lidí, kteří vstupují do parametrů duff. Například ve výše uvedeném skriptu, pokud uživatel zadá jako druhý parametr něco jiného než "aboutdotcom", zobrazí se seznam článků ze zdroje RSS z LXER bez ohledu na to, zda uživatel zadá lxer nebo ne.

Kromě toho, pokud uživatel nezadá jako "první" parametr "vše" nebo "popis", potom je výchozí seznam názvů, které mohou nebo nemusí být určeny uživateli.

Podívejte se na následující skript (nebo jej zkopírujte a vložte do souboru rssget.sh.

#! / bin / bash

pokud [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
pak
pokud [$ 1 = "all"] || [$ 1 = "popis"] || [$ 1 = "název"]
pak
pokud [$ 2 = "aboutdotcom"]
pak

pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "popis"]
pak
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
jiný
pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "popis"]
pak
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

První věc, kterou je třeba poznamenat, je, že skript se nyní stává poměrně velký a můžete rychle vidět, jak se mohou řídit vnořené IF příkazy.

Bit, který je v tomto skriptu důležitý, je příkaz IF || příkaz THEN část na řádku 2 a řádek 4.

The || znamená OR. Takže řádek pokud [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] zkontroluje, zda se druhý parametr rovná "aboutdotcom" nebo "lxer". Pokud to není, pak IF příkaz je úplný, protože neexistuje žádný jiný příkaz pro vnější většinu IF.

Podobně na řádku 4 řádek pokud [$ 1 = "all"] || [$ 1 = "popis"] || [$ 1 = "title"] zkontroluje, zda se první parametr rovná buď "all" nebo "description" nebo "title".

Nyní, pokud uživatel běží sh rssget.sh bramborový sýr se nic nevrací, zatímco předtím by dostali seznam titulů z LXER.

Opaky || je &&. Operátor && znamená AND.

Chystám se, aby scénář vypadal ještě víc jako noční můra, ale provádí všechny důležité kontroly, aby se ujistil, že uživatel poskytl 2 parametry.

#! / bin / bash

pokud [$ # -eq 2]
pak

pokud [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
pak
pokud [$ 1 = "all"] || [$ 1 = "popis"] || [$ 1 = "název"]
pak
pokud [$ 2 = "aboutdotcom"]
pak

pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "popis"]
pak
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
jiný
pokud [$ 1 = "vše"]
pak
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "popis"]
pak
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
jiný
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Jediný bit, který je v tomto skriptu extra, je další vnější příkaz IF následujícím způsobem: [$ # -eq 2] . Pokud si přečtete článek o vstupních parametrech, víte, že $ # vrací počet vstupních parametrů. Hodnota -eq znamená rovnost. Příkaz IF proto kontroluje, zda uživatel zadal 2 parametry, a pokud neuděli, opustí se bez nic. (Není zvláště přátelský).

Jsem si vědom toho, že tento tutoriál je poměrně velký. Tento týden nemá být víc, než abych se zabýval, ale chtěl bych pomoci skript před tím, než skončíme.

Jeden poslední příkaz, který potřebujete získat o podmíněných prohlášeních, je příkaz CASE.

#! / bin / bash


pokud [$ # -eq 2]
pak
případ $ 2 in
aboutdotcom)
případ $ 1 in
Všechno)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
popis)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
titul)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
případ $ 1 in
Všechno)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
popis)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
titul)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Vyjádření případu je hezčí způsob psaní JAKÝKOLI, POKUD JESTLI JAKÉKOLIV.

Například tuto logiku

Jestli je ovoce = banány
TAK toto
ELSE jestliže ovoce = pomeranče
TAK toto
ELSE IF ovoce = hrozny
TAK toto
END IF

lze přepsat jako:

případ plody v
banány)
Udělej to
;;
pomeranče)
Udělej to
;;
hrozny)
Udělej to
;;
esac

V podstatě první položka po případu je věc, kterou budete porovnávat (tj. Ovoce). Pak každá položka před závorami je věc, kterou srovnáváte a pokud se shoduje s řádky předcházející ;; bude běžet. Příkaz pro případ je ukončen pomocí zpětného esa (což je případ zpět).

Ve scénáři rssget.sh odstraňuje případové prohlášení některé z těch hrozných hnízdění, i když se tomu opravdu nestačí.

Chcete-li skutečně zlepšit tento skript, musím vám představit proměnné.

Podívejte se na následující kód:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

pokud [$ # -lt 2] || [$ # -gt 2]
pak
echo "použití: rssget.sh [all | description | title] [aboutdotcom | lxer]";
výstup;
fi

případ $ 1 in
Všechno)
zobrazení = "- d -l-u"
;;
popis)
zobrazení = "- d -u"
;;
titul)
zobrazení = "- u"
;;
esac

případ $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ zobrazit $ url;

Proměnná je definována tím, že jí bude přidělen název a poté mu bude přiřazena hodnota. Ve výše uvedeném příkladu jsou následující přiřazení proměnných:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

Skript je okamžitě více spravovatelný pomocí proměnných. Například každý parametr je zpracováván odděleně, takže neexistují žádné vnořené IF příkazy.

Proměnná zobrazení je nyní nastavena v závislosti na tom, zda jste vybrali vše, popis nebo název a proměnná url je nastavena na hodnotu proměnné aboutdotcom nebo na hodnotu proměnné lxer v závislosti na tom, zda jste zvolili aboutdotcom nebo lxer.

Příkaz rsstail nyní musí používat hodnotu zobrazení a url pro správné spuštění.

Zatímco proměnné jsou nastaveny právě tím, že jim udělíte jméno, skutečně je budete muset umístit znak $ před nimi. Jinými slovy variable = value nastavuje proměnnou na hodnotu, zatímco proměnná $ mi dává obsah proměnné.

Následuje závěrečný skript pro tento tutoriál.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "usage: rssget.sh [vše | popis | titul] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
display = ""
url = ""

pokud [$ # -lt 2] || [$ # -gt 2]
pak
echo $ usage;
výstup;
fi

případ $ 1 in
Všechno)
zobrazení = "- d -l-u"
;;
popis)
zobrazení = "- d -u"
;;
titul)
zobrazení = "- u"
;;
*)
echo $ usage;
výstup;
;;
esac

případ $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ usage;
výstup;
esac

rsstail $ zobrazit $ url;

Výše uvedený skript zavádí více RSS kanálů a existuje proměnná použití, která uživateli říká, jak používat skript, pokud buď nezadá 2 proměnné, nebo zadává nesprávné volby pro proměnné.

souhrn

To byl epický článek a možná už příliš daleko. V další příručce vám ukážeme všechny možnosti porovnání pro IF příkazy a je ještě mnohem více, co mluvit o proměnných.

Existuje také více, co lze udělat pro zlepšení výše uvedeného skriptu, a to bude zahrnuto v budoucích průvodcích při zkoumání smyček, grepů a regulárních výrazů.

Podívejte se na sekci l Inux.about.com, kde najdete další užitečné příručky z dvojitého spouštění Windows a Ubuntu, k nastavení virtuálního stroje pomocí krabic GNOME (Procházení dolů za kategoriemi pro zobrazení seznamu článků).