Kezdõk útmutatója a BASH-nak - feltételek és változók

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:

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 / bash
rsstail -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"]
akkor
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ó megegyezik az azt követő sorok között, akkor a fi fut.

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"]
akkor
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. sor, és bemutatja a másik utasítást. 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"]
akkor
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "leírás"]
akkor
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 forgatókönyv bevezeti az elifet, ami rövid utat mutat az ELSE IF-nek.

Most a szkript a következőképpen működik. Ha a sh rssget.sh parancsot futtatod, akkor kapsz leírásokat, linkeket és címeket. Ha ahelyett, hogy csak a sh rssget.sh leírást futtatod , akkor csak címet és leírást 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"]
akkor
ha [$ 1 = "all"]
akkor
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "leírás"]
akkor
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"]
akkor
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "leírás"]
akkor
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

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"]
akkor
ha [$ 1 = "all"] || [$ 1 = "leírás"] || [$ 1 = "cím"]
akkor
ha [$ 2 = "aboutdotcom"]
akkor

ha [$ 1 = "all"]
akkor
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "leírás"]
akkor
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"]
akkor
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "leírás"]
akkor
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
fi

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 sor, ha [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] ellenőrzi, hogy a 2. paraméter egyenlő-e "aboutdotcom" vagy "lxer". Ha nem, akkor az IF-kimutatás befejeződött, mert nincs más kijelentés a legkülső IF számára.

Hasonlóképpen a 4. sorban a sor, ha [$ 1 = "all"] || [$ 1 = "leírás"] || [$ 1 = "title"] ellenőrzi, hogy az 1. paraméter megegyezik-e az "összes" vagy a "leírás" vagy "cím" értékével.

Most, ha a felhasználó futtatja a sh rssget.sh burgonya sajtot, semmit nem ad 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 2]
akkor

ha [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
akkor
ha [$ 1 = "all"] || [$ 1 = "leírás"] || [$ 1 = "cím"]
akkor
ha [$ 2 = "aboutdotcom"]
akkor

ha [$ 1 = "all"]
akkor
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "leírás"]
akkor
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"]
akkor
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "leírás"]
akkor
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
fi
fi

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 2]
akkor
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
;;
esac
fi

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án
Ezt követően
ELSE ha gyümölcs = narancs
Ezt követően
ELSE ha gyümölcs = szőlő
Ezt követően
END 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 (pl. Gyümölcs). 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 2]
akkor
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;
;;
esac
rsstail $ 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 2]
akkor
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.

összefoglalás

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.

Tekintse meg a Hogyan viselkedni (Görgessen le a kategória múltán, hogy megtekinthesse a cikkek listáját) az l inux.about.com webhelyen, és további hasznos útmutatókat talál 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 .