úvod
Vitajte v tretej časti "Sprievodcu začiatočníkmi BASH". Ak ste vynechali predchádzajúce dva články, pravdepodobne budete chcieť vedieť, čo robí táto príručka iná ako iné skripty BASH.
Táto príručka je napísaná kompletným nováčikom pre BASH a ako čitateľ, ktorý sa učíte, keď sa učím. Aj keď som nováčikom pre BASH, prichádzam z prostredia vývoja softvéru, aj keď väčšina z tých, ktoré som napísala, bola pre platformu Windows.
Prvé dve príručky nájdete na stránke:
- Sprievodca pre začiatočníkov do BASH - Hello World
- Sprievodca pre začiatočníkov na BASH - vstupné parametre
Ak ste noví používatelia skriptovania BASH, odporúčame vám čítať prvé dva príručky pred pokračovaním v tomto.
V tejto príručke budem zdôrazňovať, ako používať podmienené výkazy na testovanie vstupov používateľov a na kontrolu toho, ako funguje skript.
Nainštalujte rsstail
Ak chcete dodržiavať túto príručku, musíte nainštalovať aplikáciu príkazového riadku nazvanú rsstail, ktorá sa používa na čítanie RSS kanálov.
Ak používate typ distribúcie na báze Debianu / Ubuntu / Mint, postupujte nasledovne:
sudo apt-get nainštalovať rsstail
Pre Fedora / CentOS atď zadajte nasledovné:
inštalovať rsstail
Pre typ openSUSE:
zypper install rsstail
Príkaz IF
Otvorte terminál a vytvorte súbor s názvom rssget.sh zadaním nasledujúceho:
sudo nano rssget.sh
V rámci editora nano zadajte nasledujúci text:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Uložte súbor stlačením kombinácie klávesov CTRL a O a potom stlačte klávesy CTRL a X.
Spustite skript zadaním nasledujúceho:
sh rssget.sh
Skript vráti zoznam titulov z RSS kanálu linux.about.com.
Nie je to príliš užitočný skript, pretože práve načíta názvy z jedného RSS kanálu, ale ušetrí, že si musí pamätať cestu k RSS feedu Linux.about.com.
Otvorte znova skript rssget.sh v nano a upravte súbor takto:
#! / Bin / bash
ak $ 1 = "verbose"potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Skript spustite znova zadaním nasledujúceho:
sh rssget.sh verbose
Tentokrát sa RSS feed vráti s názvom, odkazom a popisom.
Skúsme podrobne analyzovať scenár:
#! / Bin / bash sa zobrazí v každom skripte, ktorý píšeme. Nasledujúci riadok sa v podstate pozerá na prvý vstupný parameter poskytnutý používateľom a porovnáva ho so slovom "verbose". Ak sa vstupný parameter a slovo "verbose" zhodujú s čiarami medzi potom a fi sú spustené.
Vyššie uvedený skript je očividne chybný. Čo sa stane, ak vôbec neposkytnete vstupný parameter? Odpoveďou je, že dostanete chybu v podobe neočakávaného operátora.
Ďalšou hlavnou chybou je, že ak neposkytnete slovo "verbose", potom sa nič nedeje. V ideálnom prípade, ak neposkytnete slovo verbose, skript vráti zoznam titulov.
Použite nano znova na úpravu súboru rssget.sh a zmeňte kód takto:
#! / Bin / bash
ak $ 1 = "verbose"potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Uložte súbor a spustite ho zadaním nasledujúceho:
sh rssget.sh verbose
Zobrazí sa zoznam titulov, popisov a odkazov. Teraz spustite znova takto:
sh rssget.sh tituly
Tentokrát sa zobrazí iba zoznam titulov.
Ďalšia časť skriptu je na riadku 4 a zavádza inak vyhlásenia. V podstate skript teraz hovorí, že ak prvý parameter je slovo "verbose" dostať popis, odkazy a tituly pre RSS kanál, ale ak prvý parameter je čokoľvek iný len získať zoznam titulov.
Skript sa mierne zlepšil, ale je stále chybný. Ak nezadáte parameter, stále sa zobrazí chyba. Dokonca aj vtedy, keď zadáte parameter, jednoducho tým, že nechcete, aby verbose neznamená, že chcete iba tituly. Možno ste práve napísali verbose zlé, napríklad, alebo môžete mať písať holuby, čo je samozrejme bezvýznamné.
Skôr než sa pokúsime vyriešiť tieto problémy, chcem vám ukázať ešte jeden príkaz, ktorý je súčasťou vyhlásenia IF.
Upravte svoj skript rssget.sh tak, aby vyzeral nasledovne:
#! / Bin / bash
ak $ 1 = "all"potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "popis"potom rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Rozhodol som sa, že sa zbavím tohto slova a nahradím ho všetkými. To nie je dôležitá súčasť. Skript uvedený vyššie Elif čo je krátky spôsob, ako hovoriť ELSE IF.
Teraz scenár funguje nasledovne. Ak spustíte sh rssget.sh všetko potom dostanete popisy, odkazy a názvy. Ak namiesto toho práve bežíte sh rssget.sh popisdostanete len tituly a popisy. Ak dodáte akékoľvek iné slovo, dostanete zoznam titulov.
To zavádza spôsob, ako rýchlo prichádzať so zoznamom podmienečných vyhlásení. Alternatívnym spôsobom vykonávania funkcie ELIF je používať to, čo je známe ako vnorené vyhlásenia IF.
Nasleduje príklad toho, ako fungujú vnorené príkazy IF:
#! / Bin / bash
ak $ 2 = "aboutdotcom"potom ak $ 1 = "all" potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "popis" potom rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fiinak ak $ 1 = "all" potom rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "popis" potom rsstail -d -u http://lxer.com/module/newswire/headlines.rss inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Neváhajte a napíšete všetko, čo sa vám páči, alebo ho skopírujte a vložte do svojho súboru rssget.sh.
Uvedený skript predstavuje druhý parameter, ktorý vám umožňuje vybrať buď "about.com" alebo "lxer.com" ako RSS kanál.
Ak chcete spustiť, zadáte nasledovné:
sh rssget.sh všetko aboutdotcom
alebo
sh rssget.sh všetko lxer
Môžete samozrejme nahradiť všetky s popismi alebo titulmi, aby ste poskytli len popisy alebo len tituly.
V podstate vyššie uvedený kód hovorí, že ak je druhý parameter aboutdotcom, pozrite sa na druhý príkaz if, ktorý je ten istý z predchádzajúceho skriptu inak, ak je druhý parameter lxer, potom sa znova pozrie na vnútorný príkaz if, aby sa rozhodlo, či sa majú zobraziť tituly, opisy alebo všetko.
Tento skript je poskytnutý výlučne ako príklad vnoreného príkazu IF a existuje toľko vecí, ktoré s tým skriptom nie sú správne, že by si vyžiadal ďalší článok, ktorý by im vysvetlil všetky. Hlavnou otázkou je, že nie je škálovateľná.
Predstavte si, že chcete pridať ďalší RSS kanál, ako napríklad Everyday Linux User alebo Linux Today? Skript by sa stal obrovským a ak ste sa rozhodli, že chcete, aby sa vnútorné IF vyhlásenie zmenilo, museli by ste ho zmeniť na viacerých miestach.
Hoci je čas a miesto pre vnorené IF, mali by byť použité šetrne. Zvyčajne existuje spôsob refaktora vášho kódu, takže vôbec nepotrebujete vnorené IF. Na túto tému sa budem venovať v budúcom článku.
Poďme sa teraz pozrieť na vyriešenie otázky ľudí, ktorí vstupujú do parametrov duff. Napríklad vo vyššie uvedenom skripte, ak používateľ zadá niečo iné ako "aboutdotcom" ako druhý parameter, potom sa z článkov RSS z LXER zobrazí zoznam článkov bez ohľadu na to, či používateľ zadá lxer alebo nie.
Okrem toho, ak používateľ nezadá ako prvý parameter "všetko" alebo "popis", predvolený je zoznam názvov, ktoré môžu alebo nemusia byť určené užívateľovi.
Pozrite sa na nasledujúci skript (alebo ho skopírujte a vložte do súboru rssget.sh.
#! / Bin / bash
ak $ 2 = "aboutdotcom" || $ 2 = "lxer"potom ak $ 1 = "všetko" || $ 1 = "popis" || $ 1 = "title" potom ak $ 2 = "aboutdotcom" potom ak $ 1 = "all" potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "popis" potom rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi inak ak $ 1 = "all" potom rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "popis" potom rsstail -d -u http://lxer.com/module/newswire/headlines.rss inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Prvá vec, ktorú treba poznamenať, je, že skript sa teraz dostáva do značnej miery a môžete rýchlo zistiť, ako sa môžu stať mimo riadené vnorené IF vyhlásenia.
Bit, ktorý je dôležitý v tomto skripte, je príkaz IF || vyhlásenie THEN časť na riadku 2 a riadok 4.
The || znamená OR. Takže linkaak $ 2 = "aboutdotcom" || $ 2 = "lxer"skontroluje, či sa druhý parameter rovná "aboutdotcom" alebo "lxer". Ak to nie je potom IF príkaz je kompletný, pretože nie je inak vyhlásenie pre vonkajšie IF.
Podobne na riadku 4 linku ak $ 1 = "všetko" || $ 1 = "popis" || $ 1 = "title"či prvý parameter sa rovná buď "všetkým", alebo "popisu" alebo "názvu".
Teraz, ak používateľ bežísh rssget.sh zemiakový syrnič sa nevracalo, kým predtým by dostali zoznam titulov od LXER.
Opačný bod || je &&. Operátor && znamená AND.
Chystám sa, aby scenár vyzeral ešte viac ako nočná mora, ale urobí dôležitú kontrolu, aby sa ubezpečil, že používateľ poskytol 2 parametre.
#! / Bin / bash
ak $ # -eq 2potom
ak $ 2 = "aboutdotcom" || $ 2 = "lxer" potom ak $ 1 = "všetko" || $ 1 = "popis" || $ 1 = "title" potom ak $ 2 = "aboutdotcom" potom ak $ 1 = "all" potom rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "popis" potom rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi inak ak $ 1 = "all" potom rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "popis" potom rsstail -d -u http://lxer.com/module/newswire/headlines.rss inak rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Jediný bit, ktorý je navyše v tomto skripte, je ďalší vonkajší IF príkaz nasledovne:ak $ # -eq 2, Ak čítate článok o vstupných parametroch, viete, že $ # vráti počet vstupných parametrov. Hodnota -eq je rovná. Vyhlásenie IF teda kontroluje, či používateľ zadal 2 parametre a či to nie je len to, že sa opúšťa bez toho, aby urobil čokoľvek. (Nie veľmi priateľský).
Som si vedomý toho, že tento návod je dosť veľký. Tento týždeň nie je o nič viac, ale chcem vám pomôcť upraviť skript pred tým, ako skončíme.
Posledný príkaz, ktorý potrebujete naučiť o podmienených vyhláseniach, je príkaz CASE.
#! / Bin / bash
ak $ # -eq 2potom prípad 2 USD aboutdotcom) prípad $ 1 all) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; opis) 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) prípad $ 1 all) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; opis) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titul) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Vyhlásenie prípadu je skvelý spôsob písania AK JEDENKOĽVEK, AK INÉ, AK JE ĎALEJ. Napríklad túto logiku Ak ovocie = banányPotom totoĎALŠIE ak ovocie = pomarančePotom totoĎALŠIE ak ovocie = hroznoPotom totoKONIEC AK možno prepísať ako: prípad ovocie v banány) to urobiť ;; pomaranče) to urobiť ;; hrozno) to urobiť ;;esac V podstate prvá položka po prípade je vec, ktorú budete porovnávať (t. J. Ovocie). Potom každá položka pred zátvorkami je vec, ktorú porovnávate a ak sa zhoduje s predchádzajúcimi riadkami ;; bude bežať. Vyhlásenie prípadu je ukončené spätným esakom (čo je prípad späť). V skripte rssget.sh vyhlásenie o veci odstráni niektoré z týchto hrozných hniezd, aj keď to naozaj nevedie k tomu, aby sa to dostatočne zlepšilo. Ak chcete skutočne skript vylepšiť, musím vám predstaviť premenné. Pozrite sa na nasledujúci kód: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" ak $ # -lt 2 || $ # -gt 2potom echo "používanie: rssget.sh all | description | title aboutdotcom | lxer"; východ;fi prípad $ 1 all) zobrazenie = "- d -l-u" ;; opis) zobrazenie = "- d -u" ;; titul) zobrazenie = "- u" ;;esac prípad 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ zobraziť $ url; Premenná sa definuje tak, že jej zadá meno a potom mu priradí hodnotu. Vo vyššie uvedenom príklade sú nasledujúce priradenia premenných: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" Skript je okamžite zvládnuteľný pomocou premenných. Napríklad každý parameter sa spracováva oddelene, takže neexistujú žiadne vnorené IF príkazy. Premenná zobrazenia je teraz nastavená v závislosti od toho, či ste vybrali všetko, popis alebo názov a premenná url je nastavená na hodnotu premennej aboutdotcom alebo na hodnotu premennej lxer v závislosti od toho, či ste zvolili aboutdotcom alebo lxer. Príkaz rsstail teraz musí použiť správne zobrazenie a url. Zatiaľ čo premenné sú nastavené len tým, že im dáte meno, skutočne ich používať, musíte umiestniť znak $ pred nimi. Inými slovami, premenná = hodnota nastavuje premennú na hodnotu, zatiaľ čo premenná $ mi dáva obsah premennej. Nasleduje finálny skript pre 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šetky | popis | názov lxer | aboutdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" ak $ # -lt 2 || $ # -gt 2potom echo $ usage; východ;fi prípad $ 1 all) zobrazenie = "- d -l-u" ;; opis) zobrazenie = "- d -u" ;; titul) zobrazenie = "- u" ;; *) echo $ usage; východ; ;;esac prípad 2 USD aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; východ;esac rsstail $ zobraziť $ url; Uvedený skript prináša viac informačných kanálov RSS a existuje premenná používania, ktorá užívateľovi povie, ako používať skript, ak buď nezadajú dve premenné, alebo zadajú nesprávne voľby pre premenné. Bol to epický článok a možno príliš skoro. V ďalšej príručke vám ukážem všetky možnosti porovnania IF vyhlásení a ešte je oveľa viac, o čom sa hovoriť v súvislosti s premennými. Existuje aj viac, čo možno urobiť na zlepšenie vyššie uvedeného skriptu, a to bude zahrnuté v budúcich sprievodcov pri skúmaní slučiek, grep a regulárnych výrazov. Ak chcete nájsť viac užitočných sprievodcov z dvojitého spustenia systému Windows a Ubuntu, pozrite si sekciu Ako postupovať (posúvajte sa nadol za kategóriami a zobrazíte zoznam článkov) na stránke linux.about.com a nastavte virtuálny počítač pomocou polí GNOME. zhrnutie













