Sprievodca pre začiatočníkov na BASH - podmienky a premenné

ú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:

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 / bash
rsstail -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 vstupný parameter a slovo "verbose" sa zhodujú s čiarami medzi týmito slovami a fiškami .

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.

Extra časť skriptu je na riadku 4 a zavádza iný príkaz. 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 predstavuje 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 opisy, odkazy a názvy. Ak namiesto toho práve spustite sh rssget.sh popis , získate 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;
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

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
fi
fi

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 riadok, ak [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] skontroluje, či sa druhý parameter rovná "aboutdotcom" alebo "lxer". Ak to nie je, potom IF príkaz je úplný, pretože neexistuje iný výraz pre vonkajšie IF.

Podobne na riadku 4 riadok, ak [$ 1 = "všetko"] || [$ 1 = "popis"] || [$ 1 = "title"] kontroluje, či sa prvý parameter rovná buď "all" alebo "description" alebo "title".

Teraz, ak užívateľ beží šarža brassa rssget.sh, nič nie je vrátené, kým predtým by dostali zoznam titulov z 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 2]
potom

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
fi
fi

Jediný bit, ktorý je navyše v tomto skripte, je ďalší vonkajší IF príkaz takto: if [$ # -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 2]
potom
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
;;
esac
fi

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ány
Potom toto
ĎALŠIE ak ovocie = pomaranče
Potom toto
ĎALŠIE ak ovocie = hrozno
Potom toto
KONIEC 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ť (tj 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 2]
potom
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;
;;
esac
rsstail $ 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 2]
potom
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é.

zhrnutie

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 How To (Prejdite nadol za kategóriami, kde nájdete zoznam článkov) v časti l inux.about.com a nastavte virtuálny počítač pomocou krabičiek GNOME .