Bevezetés
Üdvözöljük a BASH Kezdők Útmutatójának harmadik részében. Ha elmulasztotta az előző két cikket, akkor valószínűleg tudni fogja, mi teszi ezt az útmutatót más BASH szkriptekhez.
Ez az útmutató a BASH-nak egy teljesen új kezdőjeként íródott, és egy olyan olvasónak, amilyent megtanultam. Bár én vagyok a BASH kezdője, szoftverfejlesztési hátteremből származom, bár a legtöbbet, amit írom, a Windows platform számára készült.
Az első két útmutatást megtekintheti:
- Kezdõ útmutató a BASH-hoz - Hello World
- Kezdõ útmutató BASH - bemeneti paraméterekhez
Ha újak vagyunk a BASH szkriptekhez, akkor javasoljuk, hogy olvassa el az első két útmutatást, mielőtt folytatná ezt.
Ebben a kézikönyvben kiemelném a feltételes utasítások használatát a felhasználói bevitel teszteléséhez és a parancsfájlok működésének ellenőrzéséhez.
Az rsstail telepítése
Ennek az útmutatónak a követése érdekében telepítenie kell egy rsstail nevű parancssori alkalmazást, amely az RSS-hírcsatornák olvasására szolgál.
Ha Debian / Ubuntu / Mint alapú terjesztési típust használ, akkor:
sudo apt-get install rsstail
Fedora / CentOS stb. Gépeléshez írja be a következőket:
yum install rsstail
Az openSUSE esetében írja be a következőket:
zypper install rsstail
Az IF nyilatkozat
Nyisson meg egy terminált, és hozzon létre egy rssget.sh nevű fájlt az alábbiak beírásával:
sudo nano rssget.sh
A nano szerkesztőn belül írja be a következő szöveget:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Mentse a fájlt a CTRL és az O gombbal, majd a CTRL és az X gombbal lépjen ki.
Futtassa a szkriptet az alábbiak beírásával:
sh rssget.sh
A parancsfájl visszaadja a linux.about.com RSS feed címsorát.
Ez nem túlságosan hasznos szkript, mert csak elveszi a címeket egy RSS-hírcsatornából, de nem menti fel a Linux.about.com RSS-hírcsatornájának elérését.
Nyissa meg újra a rssget.sh szkriptet a nano-ban, és módosítsa a fájlt a következőképpen:
#! / Bin / bash
ha $ 1 = "verbose"azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Futtassa újra a szkriptet az alábbiak beírásával:
sh rssget.sh verbose
Ezúttal az RSS-hírcsatorna visszaadja a címet, a linket és a leírást.
Elemezzük részletesen a forgatókönyvet:
A #! / Bin / bash minden forgatókönyvben megjelenik. A következő sor lényegében a felhasználó által megadott első bemeneti paramétert vizsgálja, és összehasonlítja a "verbose" szóval. Ha a bemeneti paraméter és a "verbose" szó egyezik a sorok között azután és fi futnak.
A fenti szkript nyilvánvalóan hibás. Mi történik, ha egyáltalán nem ad meg input paramétert? A válasz az, hogy hibát észlel a váratlan operátor sorai mentén.
A másik nagy hiba az, hogy ha nem adja meg a "verbose" szót, akkor semmi sem történik. Ideális esetben, ha nem adja meg a szó verbose, a szkript visszaküldi a címek listáját.
Használja ismét a nano-ot a rssget.sh fájl szerkesztéséhez, és módosítsa a kódot az alábbiak szerint:
#! / Bin / bash
ha $ 1 = "verbose"azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;más rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Mentse el a fájlt és futtassa azt a következő paranccsal:
sh rssget.sh verbose
Megjelenik a címek, leírások és linkek listája. Most futtassa újra a következőképpen:
sh rssget.sh címeket
Ezúttal csak a címek listája jelenik meg.
A szkript extra része a 4-es sorozatban és bemutatja a más nyilatkozat. Alapjában véve a szkript most azt mondja, hogy az első paraméter a "verbose" szó kapja az RSS-cím leírását, linkjeit és címét, de ha az első paraméter bármi más, akkor csak címek listáját kapja meg.
A forgatókönyv kissé javult, de még mindig hibás. Ha nem ad meg paramétert, továbbra is hibaüzenetet kap. Még akkor is, ha megad egy paramétert, csak azt mondja, hogy nem szeretné, hogy a verbose nem jelenti azt, hogy csak címeket szeretne. Lehet, hogy például tévesen tévedtél, vagy esetleg beírtad a galambokat, ami persze értelmetlen.
Mielőtt megpróbálnánk kijavítani ezeket a kérdéseket, szeretnék megmutatni még egy parancsot, amely az IF nyilatkozattal megy.
Szerkessze rssget.sh szkriptjét a következőképpen:
#! / Bin / bash
ha $ 1 = "all"azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "leírás"azután rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Úgy döntöttem, hogy megszabadulok a szóval szóktól, és mindenkivel helyettesítem. Ez nem a fontos rész. A fenti szkript bemutatja elif ami az ELSE IF rövid leírása.
Most a szkript a következőképpen működik. Ha futsz sh rssget.sh minden akkor kapsz leírások, linkek és címek. Ha inkább csak futsz SH rssget.sh leíráscsak címeket és leírásokat kapsz. Ha bármilyen más szót adsz, kapsz egy címet.
Ez olyan módszert vezet be, amely hamarosan megjelenik a feltételes kimutatások listáján. Az ELIF alternatív módja az úgynevezett beágyazott IF-kimutatások használata.
Az alábbi példa azt mutatja meg, hogy a beágyazott IF-utasítások hogyan működnek:
#! / Bin / bash
ha $ 2 = "aboutdotcom"azután ha $ 1 = "all" azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "leírás" azután rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fimás ha $ 1 = "all" azután rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "leírás" azután rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Nyugodtan írjon be mindent, ha tetszik, vagy másolja be és illessze be a rssget.sh fájlba.
A fenti script bemutatja a 2. paramétert, amely lehetővé teszi a "about.com" vagy az "lxer.com" és az RSS feed kiválasztását.
A futtatáshoz írja be a következőket:
sh rssget.sh minden aboutdotcom
vagy
sh rssget.sh minden lxer
Természetesen mindegyik leírást vagy címet helyettesítheti, csak leírásokat vagy címeket adhat meg.
Alapvetően a fenti kód azt mondja, hogy a második paraméter aboutdotcom, akkor nézd meg a második if utasítást, amely ugyanaz az előző szkript más, ha a második paraméter lxer, akkor nézd meg a belső, ha nyilatkozatot újra eldönteni, hogy mutasson címeket, leírásokat vagy mindent.
Ez a parancsfájl kizárólag egy beágyazott IF-kimutatás példájaként szolgál, és sok olyan dolog van benne, ami a szkripttel megegyezne. A fő kérdés az, hogy nem skálázható.
Képzelje el, hogy szeretne egy másik RSS-hírcsatornát, például a mindennapi Linux-felhasználókat vagy a Linuxot ma? A szkript hatalmas lesz, és ha úgy döntött, hogy megváltoztatja a belső IF nyilatkozatot, több helyen is meg kell változtatnia.
Míg van egy idő és egy hely a beágyazott IF-nek, ezeket takarékosan kell használni. Általában van módja annak, hogy újra kódolja a kódot, hogy egyáltalán nincs szükség a beágyazott IF-re. Erre a témára jövök.
Most nézzük meg a duff-paraméterek bevitelének kérdését. Például a fenti parancsfájlban, ha a felhasználó a 2. paraméter helyett a "aboutdotcom" -t adja meg, akkor a cikkek listája a LXER RSS-hírcsatornájából, függetlenül attól, hogy a felhasználó belép-e a lxer-be vagy sem.
Ezenkívül, ha a felhasználó nem írja be az "összes" vagy a "leírás" első paramétert, akkor az alapértelmezés olyan címek listája, amelyek lehetnek vagy nem a felhasználó szándékai.
Nézze meg a következő szkriptet (vagy másolja be és illessze be a rssget.sh fájlba.
#! / Bin / bash
ha $ 2 = "aboutdotcom" || $ 2 = "lxer"azután ha $ 1 = "all" || $ 1 = "leírás" || $ 1 = "cím" azután ha $ 2 = "aboutdotcom" azután ha $ 1 = "all" azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "leírás" azután rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi más ha $ 1 = "all" azután rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "leírás" azután rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
Az első dolog megjegyezni, hogy a forgatókönyv most már meglehetősen nagy, és gyorsan látja, hogy az ellenőrzési nested IF utasítások hogyan válhatnak.
A szkriptben fontos bit az IF utasítás || nyilatkozat THEN szakasz a 2. és a 4. sorban.
A || jelentése OR. Tehát a sorha $ 2 = "aboutdotcom" || $ 2 = "lxer"ellenőrzi, hogy a 2. paraméter egyenlő-e "aboutdotcom" vagy "lxer". Ha nem, akkor az IF utasítás teljes, mert nincs más nyilatkozat a külső leginkább HA.
Hasonlóképpen a 4. sorban a sor ha $ 1 = "all" || $ 1 = "leírás" || $ 1 = "cím"ellenőrzi, hogy az 1. paraméter egyenlő-e az "összes" vagy a "leírás" vagy a "cím" -rel.
Most, ha a felhasználó futsh rssget.sh burgonya sajtotsemmit nem adnak vissza, míg mielőtt megkapnák a LXER címek listáját.
Az ellenkezője || a &&. Az && operátor az AND kifejezést jelöli.
A forgatókönyvet még inkább egy rémálomnak tekinteném, de minden fontos ellenőrzést elvégez, hogy megbizonyosodjon róla, hogy a felhasználó 2 paramétert adott meg.
#! / Bin / bash
ha $ # -eq 2azután
ha $ 2 = "aboutdotcom" || $ 2 = "lxer" azután ha $ 1 = "all" || $ 1 = "leírás" || $ 1 = "cím" azután ha $ 2 = "aboutdotcom" azután ha $ 1 = "all" azután rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "leírás" azután rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi más ha $ 1 = "all" azután rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "leírás" azután rsstail -d -u http://lxer.com/module/newswire/headlines.rss más rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
Az egyetlen olyan bit, ami extra a szkriptben, egy másik külső IF utasítás az alábbiak szerint:ha $ # -eq 2. Ha elolvassa a bemeneti paraméterekről szóló cikket, akkor tudni fogja, hogy $ # visszaadja a bemeneti paraméterek számát. A -equ egyen egyenlő. Az IF utasítás tehát azt ellenőrzi, hogy a felhasználó 2 paramétert adott-e be, és ha nem csak kilép, anélkül, hogy bármit megtennének. (Nem különösebben barátságos).
Tudom, hogy ez a bemutató elég nagy. Ezen a héten nem sok más van, de segíteni szeretnék a forgatókönyv megszilárdítása előtt.
Az egyik utolsó parancs, amelyre a feltételes utasításokra van szükség, a CASE utasítás.
#! / Bin / bash
ha $ # -eq 2azután esetben $ 2 aboutdotcom) esetben $ 1 be minden) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; leírás) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; cím) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) esetben $ 1 be minden) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; leírás) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; cím) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
Az esettanulmány egy szebb módja annak, hogy írjunk IF ELSE IF ELSE IF ELSE IF. Például ez a logika HA gyümölcs = banánEzt követőenELSE ha gyümölcs = narancsEzt követőenELSE ha gyümölcs = szőlőEzt követőenEND IF lehet újraírni, mint: eset gyümölcsöt banán) csináld ezt ;; narancs) csináld ezt ;; szőlő) csináld ezt ;;esac Alapvetően az első tétel az ügy után az a dolog, amit össze fog hasonlítani (azaz gyümölcsöt). Ezután a zárójelek előtt minden elem az a dolog, amellyel összehasonlít, és ha megfelel a következő soroknak ;; futni fog. Az esettanulmányt a fordított esac (azaz hátrafelé) visszaállítja. Az rssget.sh szkriptben az esettanulmány eltávolítja a rettenetes fészkelés egy részét, bár nem igazán javítja eléggé. Ahhoz, hogy valóban javítsam a forgatókönyvet, be kell mutatni a változóknak. Nézd meg a következő kódot: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" ha $ # -lt 2 || $ # -gt 2azután echo "használat: rssget.sh minden | leírás | title aboutdotcom | lxer"; kijárat;fi esetben $ 1 be minden) display = "- d -l -u" ;; leírás) display = "- d -u" ;; cím) display = "- u" ;;esac esetben $ 2 aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url; Egy változót úgy definiálunk, hogy megadunk neki egy nevet, és hozzárendelünk egy értéket. A fenti példában a következő változók hozzárendelései vannak: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" A szkript azonnal kezelhetőbb változók használatával. Például minden paramétert külön kezeljük, így nincsenek beágyazott IF-kimutatások. A megjelenítési változó beállítható attól függően, hogy az összeset, leírást vagy címet választotta-e, és az url változó a kbdotcom változó vagy az lxer változó értékére van állítva attól függően, hogy a aboutdotcom vagy lxer értéket választotta-e. Az rsstail parancsnak most csak a kijelző és az URL helyes működéséhez kell használnia. Míg a változókat csak név szerint adják meg, és ténylegesen használják őket, előbb egy $ jelet kell elhelyezniük. Más szóval a variable = value értéket állít be egy értékre, míg $ változó érték adja meg a változó tartalmát. A következő az utolsó bemutató. #! / 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 minden | leírás | cím lxer | aboutdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" ha $ # -lt 2 || $ # -gt 2azután echo $ használat; kijárat;fi esetben $ 1 be minden) display = "- d -l -u" ;; leírás) display = "- d -u" ;; cím) display = "- u" ;; *) echo $ használat; kijárat; ;;esac esetben $ 2 aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ használat; kijárat;esac rsstail $ display $ url; A fenti szkript több RSS-hírcsatornát vezet be, és van egy használati változó, amely megmagyarázza a felhasználónak, hogyan kell használni a szkriptet, ha nem írnak be 2 változót, vagy helytelen opciókat adnak be a változók számára. Ez egy epikus cikk volt, és túl messzire ment túlságosan. A következő útmutatóban megmutatom Önnek az IF-kimutatások összehasonlítási lehetőségeit, és még mindig sok van még beszélni a változókkal kapcsolatban. Van még több, amit a fenti szkript javítására lehet tenni, és ezt a jövõbeli útmutatók fogják lefedni, miközben feltérképezünk hurkot, grep-et és szabályos kifejezéseket. A linux.about.com webhelyen keresse meg a How To (Görgetőgombot a kategóriák melletti listában, hogy megtekinthesse a cikkek listáját), hogy több hasznos útmutatást találjon a Windows és az Ubuntu kettős indításáról a virtuális gép GNOME-fiókok létrehozásával kapcsolatban. összefoglalás