Beginnersgids tot BASH - Voorwaardes en Veranderlikes

inleiding

Welkom by die derde deel van die "Beginners Guide to BASH". As jy die vorige twee artikels gemis het, sal jy waarskynlik wil weet wat hierdie gids verskil van ander BASH-scriptgidse.

Hierdie gids word deur 'n volledige beginner aan BASH geskryf en as 'n leser leer jy soos ek leer. Terwyl ek 'n beginner is vir BASH, kom ek uit 'n sagteware-ontwikkeling agtergrond, hoewel die meeste van die dinge wat ek geskryf het, vir die Windows-platform was.

U kan die eerste twee gidse sien deur te besoek:

As jy nuut is vir BASH-skripsie, beveel ek aan om die eerste twee gidse te lees voordat jy verder gaan met hierdie.

In hierdie gids sal ek beklemtoon hoe om voorwaardelike stellings te gebruik om gebruikersinvoer te toets en om te kontroleer hoe 'n script funksioneer.

Installeer rsstail

Om hierdie gids te volg, moet u 'n command line-program genaamd rsstail installeer wat gebruik word om RSS feeds te lees.

As jy 'n Debian / Ubuntu / Mint- gebaseerde verspreidingstipe gebruik, is die volgende:

Jy kan die installasie van Rstail installeer

Vir Fedora / CentOS ens, tik die volgende:

Ja, installeer Rsstail

Vir openSUSE, tik die volgende:

zypper installeer rsstail

Die IF verklaring

Open 'n terminaal en skep 'n lêer genaamd rssget.sh deur die volgende te tik:

sudo nano rssget.sh

Binne die nano-redigeerder, voer die volgende teks in:

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

Stoor die lêer deur Ctrl en O te druk en druk dan CTRL en X af.

Begin die skrip deur die volgende te tik:

Sh rssget.sh

Die skrip sal 'n lys titels terugstuur vanaf die linux.about.com RSS feed.

Dit is nie 'n te bruikbare skrif nie omdat dit net die titels van 'n RSS-toevoer haal, maar dit behou die pad na die Linux.about.com RSS-feed te onthou.

Maak die rssget.sh script weer in nano oop en wysig die lêer om soos volg te lyk:

#! / bin / bash

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

Begin die skrip weer deur die volgende te tik:

Sh rssget.sh verbose

Hierdie keer kom die RSS-feed terug met die titel, skakel en beskrywing.

Kom ons analiseer die skrif in 'n bietjie detail:

Die #! / Bin / bash verskyn in elke skrif wat ons skryf. Die volgende reël kyk basies na die eerste insetparameter wat deur die gebruiker verskaf word en vergelyk dit met die woord "verbose". As die insetparameter en die woord "verbose" ooreenstem met die lyne tussen dan en fi word hardloop.

Bogenoemde skrif is natuurlik foutief. Wat gebeur as jy glad nie 'n insetparameter verskaf nie? Die antwoord is dat u 'n fout kry in die lyn van onverwagte operateur.

Die ander groot fout is dat as jy nie die woord "verbose" verskaf nie, gebeur niks glad nie. Ideaal as jy nie die woord verbose gee nie, sal die skrip 'n lys titels teruggee.

Gebruik nano weer om die rssget.sh-lêer te wysig en verander die kode soos volg:

#! / bin / bash

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

Stoor die lêer en hardloop dit deur die volgende te tik:

Sh rssget.sh verbose

'N Lys van titels, beskrywings en skakels sal verskyn. Begin dit nou weer soos volg:

Sh rssget.sh titels

Hierdie keer verskyn net 'n lys titels.

Die ekstra gedeelte van die skrif is op lyn 4 en stel die ander stelling bekend. Basies sê die script as die eerste parameter die woord 'verbose' is, kry die beskrywing, skakels en titels vir die RSS-feed, maar as die eerste parameter iets anders is, kry net 'n lys titels.

Die skrif het effens verbeter, maar is steeds foutief. As u nie 'n parameter invoer nie, sal u steeds 'n fout kry. Selfs as jy 'n parameter verskaf, net deur te sê dat jy nie wil hê nie, beteken dit nie dat jy net titels wil hê nie. Jy mag dalk net verkeerd verkeerd gespel het, of jy het dalk duiwe getik wat natuurlik betekenisloos is.

Voordat ons hierdie probleme probeer oplos, wil ek jou nog een opdrag wys wat met die IF-verklaring gaan.

Wysig jou rssget.sh script om soos volg te lyk:

#! / bin / bash

as [$ 1 = "alles"]
dan
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Ek het besluit om van die woord verbose te ontslae te raak en dit met almal te vervang. Dit is nie die belangrike deel nie. Die bostaande skripsie stel elif voor wat kortliks ELSE IF kan sê.

Nou werk die script soos volg. As jy hardloop r rssget.sh, dan kry jy beskrywings, skakels en titels. As jy net die r rssget.sh beskrywing loop , sal jy net titels en beskrywings kry. As u enige ander woord verskaf, sal u 'n lys titels kry.

Dit stel 'n manier om vinnig 'n lys van voorwaardelike stellings op te stel. 'N alternatiewe manier om te doen ELIF is om te gebruik wat bekend staan ​​as geneste IF stellings.

Die volgende is 'n voorbeeld wat wys hoe geneste IF-stellings werk:

#! / bin / bash

as [$ 2 = "omdotcom"]
dan
as [$ 1 = "alles"]
dan
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
anders
as [$ 1 = "alles"]
dan
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Voer vry om dit alles in te tik as jy dit wil hê of kopieer en plak dit in jou rssget.sh lêer.

Die bogenoemde script stel 'n 2de parameter in waarmee u 'about.com' of 'lxer.com' 'n RSS-feed kan kies.

Om dit te hardloop, tik jy die volgende in:

Sh rssget.sh all aboutdotcom

of

Sh rssget.sh alle lxer

U kan natuurlik almal vervang met beskrywings of titels om net beskrywings of net titels te verskaf.

Basies die kode hierbo sê as die tweede parameter aboutdotcom is, kyk dan na die tweede as-stelling wat dieselfde is van die vorige skrip anders as die tweede parameter lxer is, kyk dan weer na die binneste as-stelling om te besluit of titels, beskrywings moet vertoon of alles.

Daardie skrif word slegs as 'n voorbeeld van 'n geneste IF-stelling verskaf en daar is soveel dinge wat verkeerd is met die skrif, dit sal 'n ander artikel neem om hulle almal te verduidelik. Die belangrikste probleem is dat dit nie skaalbaar is nie.

Stel jou voor dat jy nog 'n RSS-feed soos Everyday Linux-gebruiker of Linux vandag wil byvoeg? Die skrif sou groot word, en as jy besluit het dat jy die innerlike IF-verklaring wil verander, moet jy dit op verskeie plekke verander.

Alhoewel daar 'n tyd en plek vir 'n geneste IF is, moet hulle spaarsaam gebruik word. Daar is gewoonlik 'n manier om jou kode te reflekteer sodat jy nie die geneste IF nodig het nie. Ek sal aan hierdie onderwerp in 'n toekomstige artikel kom.

Kom ons kyk nou na die probleem van mense wat duff parameters invoer. Byvoorbeeld in die bostaande skripsie indien die gebruiker iets anders as "omdotcom" as die 2de parameter binnekom, verskyn 'n lys artikels uit die RSS-feed van LXER, ongeag of die gebruiker lxer ingevoer het of nie.

Daarbenewens as die gebruiker nie "alle" of "beskrywing" as die 1ste parameter invoer nie, is die verstek 'n lys titels wat dalk of nie die gebruiker is nie.

Kyk na die volgende skrif (of kopieer en plak dit in jou rssget.sh lêer.

#! / bin / bash

as [$ 2 = "omdotcom"] || [$ 2 = "lxer"]
dan
as [$ 1 = "alles"] | [$ 1 = "beskrywing"] | [$ 1 = "titel"]
dan
as [$ 2 = "omdotcom"]
dan

as [$ 1 = "alles"]
dan
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
anders
as [$ 1 = "alles"]
dan
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Die eerste ding om daarop te let, is dat die skrif nou redelik groot word en jy kan vinnig sien hoe buite beheer-geneste IF-stellings kan word.

Die bietjie wat belangrik is in hierdie skrif is die IF-stelling || Noem die gedeelte op lyn 2 en lyn 4.

Die || staan ​​vir OR. So die lyn as [$ 2 = "omdotcom"] || [$ 2 = "lxer"] kontroleer of die 2de parameter gelyk is aan "omdotcom" of "lxer". As dit nie die geval is nie, is die IF-verklaring volledig, want daar is geen ander stelling vir die buitenste IF nie.

Net so op lyn 4 die lyn as [$ 1 = "alles"] || [$ 1 = "beskrywing"] | [$ 1 = "title"] kontroleer of die 1ste parameter gelyk is aan óf "almal" of "beskrywing" of "titel".

Nou as die gebruiker hardloop r rget.sh aartappelskaas, word niks teruggekeer nie, voordat hulle 'n lys van titels van LXER ontvang het.

Die teenoorgestelde van || is &&. Die && operateur staan ​​vir AND.

Ek gaan die skrif laat lyk, selfs meer soos 'n nagmerrie, maar dit maak die belangrike kontrole om seker te maak dat die gebruiker 2 parameters verskaf het.

#! / bin / bash

as [$ # -eq 2]
dan

as [$ 2 = "omdotcom"] || [$ 2 = "lxer"]
dan
as [$ 1 = "alles"] | [$ 1 = "beskrywing"] | [$ 1 = "titel"]
dan
as [$ 2 = "omdotcom"]
dan

as [$ 1 = "alles"]
dan
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
anders
as [$ 1 = "alles"]
dan
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "beskrywing"]
dan
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
anders
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Die enigste bietjie wat ekstra in daardie skrif is, is 'n ander buitenste IF-stelling soos volg: as [$ # -eq 2] . As u die artikel oor insetparameters lees, sal u weet dat $ # 'n telling van die aantal insetparameters gee. Die -q staan ​​vir gelyke. Die IF-verklaring kontroleer dus dat die gebruiker 2 parameters ingevoer het en as hulle dit nie gedoen het nie, gaan dit net sonder om iets te doen. (Nie besonder vriendelik nie).

Ek is bewus daarvan dat hierdie tutoriaal taamlik groot word. Daar is nie veel meer om hierdie week te dek nie, maar ek wil help om die skrif op te ruim voordat ons klaar is.

Die een laaste opdrag wat jy oor voorwaardelike stellings moet leer, is die CASE-stelling.

#! / bin / bash


as [$ # -eq 2]
dan
geval $ 2 in
aboutdotcom)
geval $ 1 in
almal)
Rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
beskrywing)
rsstail -d-u z.about.com/6/o/m/linux_p2.xml
;;
titel)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
geval $ 1 in
almal)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
beskrywing)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
titel)
Rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Die saakstaat is 'n lekkerder skryfwerk INDIEN ANDER INDIEN ANDER INDIEN ANDER INDIEN.

Byvoorbeeld hierdie logika

INDIEN Vrugte = Piesangs
DAN dit
OF INDIEN Vrugte = Sinaasappels
DAN dit
OF INDIEN Vrugte = druiwe
DAN dit
EINDE INDIEN

kan herskryf word as:

geval vrugte in
piesangs)
doen dit
;;
lemoene)
doen dit
;;
druiwe)
doen dit
;;
esac

Basies is die eerste item na die saak die ding wat jy gaan vergelyk (dit wil sê vrugte). Dan is elke item voor die hakies die ding waarmee jy vergelyk en as dit ooreenstem met die voorgaande lyne ;; sal gehardloop word. 'N Saakstelling word beëindig met die omgekeerde esac (wat agteruit is).

In die rssget.sh script verwyder die saakstelling sommige van daardie vreeslike neswerk, hoewel dit nie regtig genoeg is nie.

Om die skrif regtig te verbeter, moet ek u veranderlikes voorstel.

Kyk na die volgende kode:

#! / bin / bash

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

as [$ # -lt 2] || [$ # -gt 2]
dan
echo "gebruik: rssget.sh [all | beskrywing | titel] [omdotcom | lxer]";
uitgang;
fi

geval $ 1 in
almal)
vertoon = "- d -l -u"
;;
beskrywing)
vertoon = "- d -u"
;;
titel)
vertoning = "- u"
;;
esac

geval $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ vertoon $ url;

'N Veranderlike word gedefinieer deur dit 'n naam te gee en dan 'n waarde daaraan toe te ken. In die bostaande voorbeeld is die volgende veranderlikes opdragte:

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

Die skrif is onmiddellik meer hanteerbaar deur veranderlikes te gebruik. Byvoorbeeld, elke parameter word afsonderlik hanteer en dus is daar geen geneste IF-stellings nie.

Die vertoning veranderlike is nou ingestel, afhangende van of jy al die beskrywing of titel gekies het en die url-veranderlike is ingestel op die waarde van die omdotcom-veranderlike of die waarde van die lxer-veranderlike, afhangende of jy kies aboutdotcom of lxer.

Die rsstail opdrag moet nou net die waarde van die vertoon en url gebruik om korrek te hardloop.

Terwyl veranderlikes gestel word net deur hulle 'n naam te gee, om hulle werklik te gebruik, moet jy 'n $ teken voor hulle plaas. Met ander woorde veranderlike = waarde stelle veranderlik tot 'n waarde terwyl $ veranderlike middele my die inhoud van die veranderlike gee.

Die volgende is die finale skrif vir hierdie handleiding.

#! / 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"
gebruik = "gebruik: rssget.sh [all | beskrywing | titel] [lxer | omdotcom | everydaylinuxuser | linuxtoday]"
vertoning = ""
url = ""

as [$ # -lt 2] || [$ # -gt 2]
dan
echo $ gebruik;
uitgang;
fi

geval $ 1 in
almal)
vertoon = "- d -l -u"
;;
beskrywing)
vertoon = "- d -u"
;;
titel)
vertoning = "- u"
;;
*)
echo $ gebruik;
uitgang;
;;
esac

geval $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
echo $ gebruik;
uitgang;
esac

rsstail $ vertoon $ url;

Bogenoemde skrip stel meer RSS feeds voor en daar is 'n gebruiksveranderlike wat die gebruiker vertel hoe om die skrif te gebruik as hulle nie 2 veranderlikes invoer nie of hulle voer verkeerde opsies vir die veranderlikes in.

opsomming

Dit is 'n epiese artikel en kan te veel te gou gegaan het. In die volgende gids sal ek jou al die vergelykingopsies vir IF-stellings wys en daar is nog baie meer om oor veranderlikes te praat.

Daar is ook meer wat gedoen kan word om die bogenoemde skrif te verbeter en dit sal in toekomstige gidse bespreek word as ons loops, grep en reguliere uitdrukkings ondersoek.

Kyk na die Hoe om te blaai langs die kategorieë om 'n lys artikels te sien) afdeling van l inux.about.com om meer handige gidse te vind van die dubbele opstart van Windows en Ubuntu om 'n virtuele masjien te installeer met GNOME-bokse .