Pradedančiųjų vadovas "BASH" - sąlygos ir kintamieji

Įvadas

Sveiki atvykę į trečiąją "Pradedančiųjų vadovo BASH" dalį. Jei praleidote ankstesnius du straipsnius, tikriausiai norėsite sužinoti, kaip šis vadovas skiriasi nuo kitų BASH scenarijų vadovų.

Šis vadovas yra parašytas visiško naujoko BASH ir kaip skaitytojas, kurį mokate mokytis. Nors aš esu naujokas BASH, aš atėjau iš programinės įrangos kūrimo, nors daugelis dalykų, kuriuos aš parašiau, buvo skirti "Windows" platformai.

Pirmuosius du vadovus galite pamatyti apsilankę:

Jei esate naujas BASH scenarijus, aš rekomenduosiu skaityti pirmuosius du vadovus, prieš tęsdami šią versiją.

Šiame vadove norėčiau paryškinti, kaip naudoti sąlygines ataskaitas, kad išbandytumėte naudotojo įvestį ir valdytumėte, kaip veikia scenarijus.

Įdiekite rsstail

Norėdami sekti šį vadovą, turėsite įdiegti komandinės eilutės programą, vadinamą rsstail, kuri yra naudojama skaityti RSS .

Jei naudojate " Debian" / " Ubuntu" / " Mint" paskirstymo tipą, atlikite šiuos veiksmus:

sudo apt-get install rsstail

Jei norite Fedora / CentOS ir tt, įveskite:

yum install rsstail

Norėdami openSUSE įveskite:

zypper įdiegti rsstail

IF teiginys

Atidarykite terminalą ir sukurkite failą rssget.sh, įveskite šiuos duomenis:

Sudo nano rssget.sh

Nano redaktoriuje įveskite šį tekstą:

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

Išsaugokite failą paspausdami CTRL ir O, tada palikdami paspauskite CTRL ir X.

Paleiskite scenarijų, įveskite šį:

sh rssget.sh

Scenarijus grąžins pavadinimų sąrašą iš "RSS" kanalo linux.about.com.

Tai nėra pernelyg naudingas scenarijus, nes jis tiesiog gauna pavadinimus iš vieno RSS kanalo, bet sutaupo, norint prisiminti kelią į "Linux.about.com" RSS kanalą.

Atidarykite scenarijų rssget.sh į nano ir redaguokite failą, kad atrodytų taip:

#! / bin / bash

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

Dar kartą paleiskite scenarijų, įveskite šiuos duomenis:

sh rssget.sh verbose

Šį kartą RSS kanalas grąžinamas su pavadinimu, nuoroda ir aprašymu.

Šiek tiek išsamiai išnagrinėsime scenarijų:

#! / Bin / bash pasirodo kiekviename scenarijuje, kurį mes rašome. Kitoje eilutėje iš esmės apžvelgiamas pirmas vartotojo įvesties parametras ir lyginamas su žodžiu "verbose". Jei įvesties parametras ir žodis "verbose" atitinka linijas tarp to ir fi prasidėjo.

Viršuje esantis scenarijus yra akivaizdžiai klaidingas. Kas atsitiks, jei nenurodysite įvesties parametro? Atsakymas yra tai, kad jūs gaunate klaidą netikėto operatoriaus eilutėmis.

Kitas svarbus trūkumas yra tai, kad jei nenurodysite žodžio "verbose", tai niekas neįvyks. Idealiu atveju, jei nesate žodžio verbose, scenarijus grąžins pavadinimų sąrašą.

Dar kartą naudokite nano redaguoti failą rssget.sh ir pakeisti kodą taip:

#! / bin / bash

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

Išsaugokite failą ir paleiskite jį, įveskite šiuos duomenis:

sh rssget.sh verbose

Bus rodomas pavadinimų, aprašų ir nuorodų sąrašas. Dabar paleiskite jį dar kartą taip:

sh rssget.sh pavadinimai

Šį kartą pasirodys tik pavadinimų sąrašas.

Papildoma scenarijaus dalis yra 4 eilutėje ir pateikiama kito teiginio. Iš esmės dabar scenarijus sako, kad jei pirmasis parametras yra žodis "verbose", gaukite RSS santraukos aprašymą, nuorodas ir pavadinimus, bet jei pirmasis parametras yra kažkas kitas, tiesiog sugalvokite pavadinimų sąrašą.

Skriptas šiek tiek pagerėjo, bet vis dar yra trūkumų. Jei nepavyks įvesti parametro, vis tiek gausite klaidą. Net jei pateikiate parametrą, tiesiog sakydamas, kad nenorite verbose, nereiškia, kad norite tik pavadinimų. Pavyzdžiui, galbūt tiesiog parašyta neteisingai, arba galbūt įvedėte balandžius, kurie, žinoma, yra beprasmiška.

Prieš bandydami išvalyti šiuos klausimus norėčiau parodyti dar vieną komandą, kuri tinka IF pareiškimui.

Redaguokite savo rssget.sh scenarijų, kad atrodytų taip:

#! / bin / bash

jei [$ 1 = "all"]
tada
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Aš nusprendžiau atsikratyti žodžio verbose ir jį pakeisti visais. Tai nėra svarbi dalis. Ankstesnis scenarijus įveda elifą, kuris yra trumpas būdas sakyti "ELSE IF".

Dabar scenarijus veikia taip. Jei paleisite sh rssget.sh, tuomet gausite aprašymus, nuorodas ir pavadinimus. Jei vietoj to tiesiog paleiskite sh rssget.sh aprašymą , tiesiog gausite pavadinimus ir aprašymus. Jei pateikiate bet kurį kitą žodį, gausite pavadinimų sąrašą.

Tai leidžia greičiau pateikti sąlyginių teiginių sąrašą. Alternatyvus elifas būdas yra naudoti tai, kas vadinama įterptais IF pareiškimais.

Toliau pateikiamas pavyzdys, rodantis, kaip įdėtos IF ataskaitos veikia:

#! / bin / bash

jei [$ 2 = "aboutdotcom"]
tada
jei [$ 1 = "all"]
tada
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Kitas
jei [$ 1 = "all"]
tada
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Nepamirškite įvesti visko, jei norite, arba nukopijuokite ir įklijuokite jį į savo failą rssget.sh.

Šis scenarijus įveda 2-ąjį parametrą, kuris leidžia pasirinkti "about.com" arba "lxer.com" RSS.

Norėdami jį paleisti įveskite:

sh rssget.sh all aboutdotcom

arba

sh rssget.sh viskas lxer

Žinoma, galite pakeisti visus aprašus ar pavadinimus, kad pateiktumėte tik aprašymus ar tiesiog pavadinimus.

Iš esmės aukščiau pateiktas kodas sako, jei antrasis parametras yra aboutdotcom, tada pažvelkite į antrąjį, jei tas teiginys yra tas pats, kuris yra iš ankstesnio scenarijaus, jei antrasis parametras yra lxer, tada pažiūrėkite į vidinį if sakinį dar kartą, jei norite nuspręsti, ar rodyti antraštes, aprašymus ar viskas.

Šis scenarijus pateikiamas tik kaip įterpto IF pranešimo pavyzdys, ir tai yra labai daug dalykų, dėl kurių šis scenarijus būtų klaidingas, viską paaiškintų dar vienas straipsnis. Pagrindinis klausimas yra tas, kad jis nėra keičiamas.

Įsivaizduokite, kad norėjote pridėti kitą RSS tiekimą, pvz., Kasdieninį "Linux" naudotoją ar "Linux Today"? Skriptas taps didžiulis, ir jei nuspręsite, kad norite, kad vidinis IF pareiškimas pasikeistų, jį turėtumėte keisti įvairiose vietose.

Nors yra laikas ir vieta įtvirtinti, jei jie turėtų būti naudojami taupiai. Paprastai yra būdas kodą ištaisyti, kad jums nieko nereikia. Aš ateisiu į šį dalyką būsimame straipsnyje.

Dabar pažvelkime į klausimą, ar žmonės įvedami į parametrus. Pavyzdžiui, aukščiau pateiktame scenarijuje, jei naudotojas įveskite kažką kitą, o ne "aboutdotcom" kaip 2-ąjį parametrą, straipsnių sąrašas pasirodo iš "LXER" RSS kanalo, nepriklausomai nuo to, ar vartotojas įveda "lxer", ar ne.

Be to, jei vartotojas neįrašo "all" arba "description" kaip 1-ojo parametro, pagal nutylėjimą yra pavadinimų sąrašas, kuris gali būti arba nebūti toks, koks numatytas vartotojui.

Pažvelkite į šį scenarijų (arba nukopijuokite ir įklijuokite jį į savo failą rssget.sh.

#! / bin / bash

jei [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
tada
jei [$ 1 = "all"] || [$ 1 = "aprašymas"] || [$ 1 = "pavadinimas"]
tada
jei [$ 2 = "aboutdotcom"]
tada

jei [$ 1 = "all"]
tada
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Kitas
jei [$ 1 = "all"]
tada
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Pirmasis dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad scenarijus dabar tampa gana didelis, ir jūs galite greitai sužinoti, kaip iš valdymo įterptų IF pareiškimų gali tapti.

Šiame scenarijuje svarbus bitas yra IF teiginys || pareiškimas THEN skyriuje 2 eilutėje ir 4 eilutėje.

|| reiškia "OR". Taigi linija, jei [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] patikrina, ar 2-asis parametras yra lygus "aboutdotcom" ar "lxer". Jei ne, tada IF pareiškimas yra baigtas, nes nėra kito teiginio apie išorinį IF.

Panašiai į eilutę 4 linija, jei [$ 1 = "all"] || [$ 1 = "aprašymas"] || [$ 1 = "title"] patikrina, ar 1-asis parametras yra lygus arba "visiems", "aprašymui" ar "antraštinei daliai".

Dabar, jei vartotojas paleidžia sh rssget.sh bulvių sūrio nieko nėra grąžinamas, kol anksčiau jie gavo pavadinimą iš LXER.

Priešingai nei || is && & & Operatorius reiškia AND.

Aš padarysiu, kad scenarijus atrodytų dar labiau kaip košmaras, tačiau jis atlieka visus svarbius patikrinimus, kad įsitikintų, jog vartotojas pateikė 2 parametrus.

#! / bin / bash

jei [$ # -eq 2]
tada

jei [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
tada
jei [$ 1 = "all"] || [$ 1 = "aprašymas"] || [$ 1 = "pavadinimas"]
tada
jei [$ 2 = "aboutdotcom"]
tada

jei [$ 1 = "all"]
tada
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
Kitas
jei [$ 1 = "all"]
tada
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "aprašymas"]
tada
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
Kitas
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Vienintelis bitas, kuris papildomas šiame scenarijuje, yra kitas išorinis IF sakinys: jei [$ # -eq 2] . Jei perskaitysite straipsnį apie įvesties parametrus, jūs žinote, kad $ # grąžina įvesties parametrų skaičių. "-eq" reiškia lygias. Todėl IF teiginys patikrina, ar vartotojas įvedė 2 parametrus, ir jei jie ne tik išeina be nieko. (Nėra ypač draugiška).

Aš žinau, kad šis vadovėlis tampa gana didelis. Šią savaitę nėra daug daugiau, bet norėčiau padėti tvarkyti scenarijų, kol mes baigsime.

Vienintelė paskutinė komanda, kurią reikia sužinoti apie sąlygines ataskaitas, yra CASE teiginys.

#! / bin / bash


jei [$ # -eq 2]
tada
2 USD atvejis
aboutdotcom)
atvejis $ 1 vnt
visi)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;;
apibūdinimas)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;;
pavadinimas)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;;
esac
;;;
lxer)
atvejis $ 1 vnt
visi)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;;
apibūdinimas)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;;
pavadinimas)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;;
esac
;;;
esac
fi

Byla yra geresnis rašymo būdas, KAD KITA, KAD JEI JEIGU, KADA JEIGU KITA.

Pavyzdžiui, ši logika

Jei vaisius = bananai
Tada tai
ELSE IF vaisiai = apelsinai
Tada tai
ELSE IF vaisiai = vynuogės
Tada tai
PABAIGA IF

gali būti perrašytas kaip:

atvežtas vaisius
bananai)
daryk tai
;;;
apelsinai)
daryk tai
;;;
vynuogės)
daryk tai
;;;
esac

Iš esmės pirmas dalykas po bylos yra dalykas, kurį ketinate palyginti (ty vaisius). Tada kiekvienas elementas prieš skliaustus yra dalykas, su kuriuo lyginate, ir ar jis atitinka linijas prieš ;; bus bėgti. Byla pasibaigia naudojant atvirkštinį esac (kuris yra atvirkščiai).

Rssject.sh scenarijuje bylos ataskaita pašalina kai kurias šias baisias lizdus, ​​nors iš tiesų to nepakankamai tobulina.

Norint iš tikrųjų patobulinti scenarijų, reikia įvesti jus į kintamuosius.

Pažvelkite į tokį kodą:

#! / bin / bash

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

jei [$ # -lt 2] || [$ # -gt 2]
tada
echo "naudojimo: rssget.sh [all | aprašymas | pavadinimas] [aboutdotcom | lxer]";
išeiti;
fi

atvejis $ 1 vnt
visi)
rodyti = "-d -l -u"
;;;
apibūdinimas)
Rodyti = "- d -u"
;;;
pavadinimas)
display = "- u"
;;;
esac

2 USD atvejis
aboutdotcom)
url = $ aboutdotcom;
;;;
lxer)
url = $ lxer;
;;;
esac
$ rsstail $ $ url;

Kintamasis apibrėžiamas suteikiant jam vardą ir paskui jam priskiriant vertę. Pirmiau pateiktame pavyzdyje yra šie kintamųjų paskyrimai:

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

Naudojant kintamuosius, scenarijus yra lengviau valdomas. Pavyzdžiui, kiekvienas parametras tvarkomas atskirai, todėl nėra įterptų IF pareiškimų.

Rodiklio kintamasis dabar nustatomas priklausomai nuo to, ar pasirinkote viską, apibūdinimą ar pavadinimą, o URL-kintamasis yra nustatytas apie aboutdotcom kintamojo reikšmę arba lxer kintamojo reikšmę, priklausomai nuo to, ar pasirinkote aboutdotcom ar lxer.

Dabar "rsstail" komanda turi tiesiog naudoti rodymo ir url reikšmę.

Nors kintamieji yra nustatomi tik suteikiant jiems vardą, iš tikrųjų juos naudoti, turite įdėti $ ženklas priešais juos. Kitaip tariant, kintamasis = reikšmė nustato kintamąjį reikšmę, o $ kintamasis reiškia man kintamojo turinį.

Toliau pateikiamas galutinis šio vadovo scenarijus.

#! / 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"
Naudojimas = "naudojimas: rssget.sh [visi | aprašymas | pavadinimas] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
ekranas = ""
url = ""

jei [$ # -lt 2] || [$ # -gt 2]
tada
echo $ naudojimo;
išeiti;
fi

atvejis $ 1 vnt
visi)
rodyti = "-d -l -u"
;;;
apibūdinimas)
Rodyti = "- d -u"
;;;
pavadinimas)
display = "- u"
;;;
*)
echo $ naudojimo;
išeiti;
;;;
esac

2 USD atvejis
aboutdotcom)
url = $ aboutdotcom;
;;;
lxer)
url = $ lxer;
;;;
linuxtoday)
url = $ linuxtoday;
;;;
kasdienlinuxuser)
url = $ everydaylinuxuser;
;;;
*)
echo $ naudojimo;
išeiti;
esac

$ rsstail $ $ url;

Viršuje esantis scenarijus įveda daugiau RSS kanalų ir yra naudojimo kintamasis, kuris vartotojui nurodo, kaip naudoti scenarijų, jei jie arba neįveda 2 kintamųjų arba jie įveda neteisingas kintamųjų parinktis.

Santrauka

Tai buvo epic straipsnis ir galbūt pernelyg pernelyg anksti. Kitame vadove parodysiu visas IF variantų palyginimo galimybes, o kalbant apie kintamuosius dar daug daugiau.

Taip pat galima padaryti daugiau, kad būtų patobulintas anksčiau pateiktas scenarijus, o tai bus nagrinėjama būsimose gairėse, kai mes ieškome kilpų, grep ir reguliarių išraiškų.

Patikrinkite "l inux.about.com" skilties "How to" (slinkite žemyn kategorijų sąrašą, norėdami pamatyti straipsnių sąrašą), kad sužinotumėte daugiau naudingų vadovų iš dvejopo paleidimo Windows ir Ubuntu, kad sukurtumėte virtualią mašiną naudojant GNOME dėžutes .