Komencanta Gvidilo Al BASH - Kondiĉoj Kaj Variabloj

Enkonduko

Bonvenon al la tria parto de la "Komenca Gvidilo Al BASH". Se vi perdis la antaŭajn du artikolojn tiam vi verŝajne volas scii, kion faras ĉi tiu gvidilo malsama al aliaj BASH-skriptaj gvidiloj.

Ĉi tiu gvidilo estas skribita per kompleta novulo al BASH kaj tiel kiel leganto, kiun vi lernas, kiel mi lernas. Dum mi estas novulo al BASH mi venas el programara evoluado, kvankam la plej multaj aferoj, kiujn mi skribis, estis por la platformo de Windows.

Vi povas vidi la du unuaj gvidiloj vizitante:

Se vi estas nova al BASH-skripto, mi rekomendas legi la du unuaj gvidiloj antaŭ daŭrigi kun ĉi tiu.

En ĉi tiu gvidilo mi reliefigos kiel uzi kondiĉajn deklarojn por provi uzantojn kaj kontroli kiel skripto funkcias.

Instali rsstail

Por sekvi ĉi tiun gvidilon, vi devos instali komandlinion, nomitan rsstail, kiu estas uzata por legi RSS-fluojn .

Se vi uzas dosieran distribuadon de Debian / Ubuntu / Mint la jenan:

sudo apt-get install rsstail

Por Fedora / CentOS ktp tajpu la jenajn:

Iru instali rsstail

Por openSUSE- tipo la jenaj:

zypper instali rsstail

La deklaro de IF

Malfermu fina stacion kaj kreu dosieron nomitan rssget.sh tajpante la jenajn:

sudo nano rssget.sh

Ene de la nano-redaktilo eniru la jenan tekston:

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

Konservu la dosieron premante CTRL kaj O kaj poste eliru premante CTRL kaj X.

Kuru la skripton tajpante la jenajn:

sh rssget.sh

La skripto redonos liston de titoloj de linux.about.com RSS-servo.

Ĝi ne estas tro utila skripto, ĉar ĝi nur retrovas la titolojn de unu RSS-servo sed ĝi ŝajnas memori la vojon al la reto de Linukso.

Malfermu la rssget.sh skripton en nano denove kaj redakti la dosieron por rigardi kiel sekvas:

#! / bin / bash

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

Ruli la skripton denove tajpante la jenajn:

sh rssget.sh verbose

Ĉi tiu fojo la RSS-servo revenas kun la titolo, ligo kaj priskribo.

Ni analizu la skripton en iom da detalo:

La #! / Bin / bash aperas en ĉiu skripto, kiun ni skribas. La sekva linio esence rigardas la unuan enmetan parametron provizita de la uzanto kaj komparas ĝin al la vorto "verbose". Se la enmeta parametro kaj la vorto "verbose" kongruas la liniojn inter tiam kaj fi kuras.

La supra skripto estas evidente malfavora. Kio okazas, se vi ne provizas enmetan parametron? La respondo vi ricevas eraron laŭ la linioj de neatendita operatoro.

La alia grava difekto estas, ke se vi ne donos la vorton "verbose", tiam nenio okazas. Ideale se vi ne provizas la vorton, la skripto revenos liston de titoloj.

Uzu nano denove por redakti la rssget.sh-dosieron kaj modifi la kodon kiel sekvas:

#! / bin / bash

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

Konservu la dosieron kaj kuri ĝin tajpante la jenon:

sh rssget.sh verbose

Listo de titoloj, priskriboj kaj ligiloj aperos. Nun kuru ĝin kiel sekvas:

sh rssget.sh titoloj

Ĉi tiu fojo nur aperas liston de titoloj.

La ekstra parto de la skripto estas sur linio 4 kaj enkondukas la alian deklaron. Esence la skripto nun diras, ĉu la unua parametro estas la vorto "verbose", ricevas la priskribon, ligilojn kaj titolojn por la RSS-servo, sed se la unua parametro estas io alia, nur ricevas liston de titoloj.

La skripto plibonigis iomete sed ankoraŭ estas misa. Se vi ne eniras parametron, vi ankoraŭ ricevos eraron. Eĉ se vi donos parametron, nur dirante ke vi ne volas verŝajne ne signifas, ke vi volas nur titolojn. Vi eble simple literumis verbose malĝuste ekzemple aŭ vi eble tajpis kolombojn, kiuj kompreneble estas senimaj.

Antaŭ ol ni provos liberigi ĉi tiujn aferojn, mi volas montri al vi unu pli grandan komandon, kiu iras kun la IF-a-deklaro.

Redaktu vian rssget.sh skripton por aspekti kiel sekvas:

#! / bin / bash

se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Mi decidis forigi la vorton verŝajne kaj anstataŭigi ĝin per ĉio. Tio ne estas la grava parto. La skripto supre prezentas elif, kiu estas mallonga maniero diri ELSE IF.

Nun la skripto funkcias kiel sekvas. Se vi kuras sh rssget.sh ĉio tiam vi ricevos priskribojn, ligilojn kaj titolojn. Se anstataŭe vi simple kuras sh rssget.sh priskribo, vi nur ricevos titolojn kaj priskribojn. Se vi provizas iun alian vorton, vi ricevos liston de titoloj.

Ĉi tio enkondukas manieron rapide supreniri kun listo de kondiĉaj deklaroj. Alternativa maniero por fari ELIF estas uzi tion, kio estas konata kiel nestitaj IF-a-deklaroj.

La jenaj ekzemploj montras kiel nestitaj IF-a-vortoj funkcias:

#! / bin / bash

se [$ 2 = "proksimume"]
tiam
se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
alia
se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Bonvolu tajpi ĉion, kvazaŭ vi ŝatus aŭ kopii kaj batu ĝin en vian rssget.sh-dosieron.

La supre skripto enkondukas duan parametron, kiu ebligas elekti ĉu "about.com" aŭ "lxer.com", kiel RSS-servo.

Por kuri ĝin vi tajpas la jenajn:

Ŝi rssget.sh ĉiuj informoj

sh rssget.sh ĉiuj lxer

Vi povas kompreneble anstataŭigi ĉiujn kun priskriboj aŭ titoloj por havigi nur priskribojn aŭ nur titolojn.

Esence la kodo supre diras, se la dua parametro estas tre komuna, tiam rigardu la duan se la deklaro, kiu estas la sama de la antaŭa skripto alia, se la dua parametro estas lxer, tiam rigardu la internan se deklaron denove por decidi ĉu montri titolojn, priskribojn aŭ ĉio.

Tiu skripto estas nur provizata kiel ekzemplo de anita IF-aserto kaj ekzistas tiom multaj aferoj malĝustaj kun tiu skripto, ke ĝi prenus alian artikolon por klarigi ilin ĉiujn. La ĉefa afero estas, ke ĝi ne estas skalebla.

Imagu, ke vi volis aldoni alian RSS-feed kiel ekzemple Ĉiutaga Linukso-Uzanto aŭ Linukso Hodiaŭ? La skripto fariĝos grandega kaj se vi decidis, ke vi volas ke la interna IF-deklaro ŝanĝu, vi ŝanĝus ĝin en multaj lokoj.

Dum ekzistas tempo kaj loko por anidata IF, ili devus esti uzataj laŭgrade. Ekzistas kutime refactori vian kodon por ke vi tute ne bezonu la aniditan IF. Mi venos al ĉi tiu temo en futura artikolo.

Ni nun rigardu ripari la aferon de homoj enirante duff-parametrojn. Ekzemple en la skripto supre se la uzanto eniras ion alian ol "proksimume" kiel la 2-a parametro, tiam listo de artikoloj aperos el la RSS-servo de LXER sendepende pri ĉu la uzanto eniras lxer aŭ ne.

Krome, se la uzanto ne eniras "ĉiuj" aŭ "priskribo" kiel la 1-a parametro, tiam la defaŭlta listo estas titoloj, kiuj eble aŭ ne estu, kion la uzanto intencis.

Rigardu la sekvan skripton (aŭ kopii kaj batu ĝin en vian rssget.sh-dosieron.

#! / bin / bash

se [$ 2 = "proksimume"] || [$ 2 = "lxer"]
tiam
se [$ 1 = "ĉiuj"] || [$ 1 = "priskribo"] || [$ 1 = "titolo"]
tiam
se [$ 2 = "proksimume"]
tiam

se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
alia
se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

La unua afero rimarki estas, ke la skripto nun fariĝas sufiĉe granda kaj vi rapide povas vidi kiel ekstere de kontrolo nestis IF-asertoj povas fariĝi.

La iom grava en ĉi tiu skripto estas la IF-a-deklaro | deklaro THEN sekcio sur linio 2 kaj linio 4.

La || staras por OR. Do la linio se [$ 2 = "proksimume"] || [$ 2 = "lxer"] kontrolas ĉu la 2-a parametro estas egala al "proksimume" aŭ "lxer". Se ĝi ne estas tiam la IF-a-deklaro estas kompleta ĉar ne ekzistas alia aserto por la ekstera plej SE.

Simile sur linio 4 la linio se [$ 1 = "ĉiuj"] || [$ 1 = "priskribo"] || [$ 1 = "titolo"] kontrolas ĉu la unua parametro estas egala al ĉio "ĉio" aŭ "priskribo" aŭ "titolo".

Nun se la uzanto kuras rssget.sh potatoes fromaĝo nenio estas revenita, sed antaŭ ol ili ricevus liston de titoloj de LXER.

La malo de || estas &&. La operatoro && staras por AND.

Mi faros la skripton aspekti eĉ pli kiel koŝmaro, sed ĝi faras la tutan gravan kontrolon por certigi, ke la uzanto provizis 2 parametrojn.

#! / bin / bash

se [$ # -eq 2]
tiam

se [$ 2 = "proksimume"] || [$ 2 = "lxer"]
tiam
se [$ 1 = "ĉiuj"] || [$ 1 = "priskribo"] || [$ 1 = "titolo"]
tiam
se [$ 2 = "proksimume"]
tiam

se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
alia
se [$ 1 = "ĉio"]
tiam
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "priskribo"]
tiam
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
alia
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

La nura bito, kiu estas ekstra en tiu skripto, estas alia ekstera IF-deklaro kiel sekvas: se [$ # -eq 2] . Se vi legis la artikolon pri enmetaj parametroj, vi scios, ke $ # redonas kalkulon de la nombro de enmetaj parametroj. La -eq staras por egalaj. La deklaro de IF sekvas, ke la uzanto eniris 2 parametrojn kaj se ili ne nur eliris sen fari ion. (Ne aparte amika).

Mi scias, ke ĉi tiu lernilo estas tre granda. Ne multe pli kovras ĉi tiun semajnon, sed mi volas helpi al ordigi la skripton antaŭ ol ni finu.

La lasta komando, kiun vi bezonas lerni pri kondiĉaj deklaroj, estas la deklaro de KOMO.

#! / bin / bash


se [$ # -eq 2]
tiam
kazas $ 2 en
proksimume)
kazas $ 1 en
ĉio)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
Priskribo)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
titolo)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
kazas $ 1 en
ĉio)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
Priskribo)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
titolo)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

La kazo-afero estas pli bela maniero de skribi IF ELSE IF ELSE IF ELSE IF.

Ekzemple ĉi tiu logiko

SE frukto = bananoj
THEN ĉi
ELSE IF frukto = oranĝoj
THEN ĉi
ELSE IF fruktoj = vinberoj
THEN ĉi
FINA SEK

povas esti reeskribita kiel:

kazon frukton
bananoj)
faru ĉi tion
;;
oranĝoj)
faru ĉi tion
;;
vinberoj)
faru ĉi tion
;;
esac

Esence la unua ero post la kazo estas la afero, kiun vi komparas (tio estas, frukto). Tiam ĉiu ero antaŭ la krampoj estas la afero, kiun vi komparas kaj se ĝi kongruas kun la antaŭaj linioj; estos kurita. Kazo-deklaro finiĝas kun la reversa esak (kiu okazas malantaŭen).

En la skripto rssget.sh la kazo-afero forigas kelkajn el tiu terura nesto kvankam ne vere plibonigas ĝin sufiĉe.

Por plibonigi la skripton mi devas prezenti al vi variablojn.

Rigardu la sekvan kodon:

#! / bin / bash

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

se [$ # -lt 2] || [$ # -gt 2]
tiam
eĥo "uzado: rssget.sh [ĉiuj | priskribo | titolo] [aboutdotcom | lxer]";
eliro;
fi

kazas $ 1 en
ĉio)
display = "- d -l -u"
;;
Priskribo)
montri = "- d -u"
;;
titolo)
montri = "- u"
;;
esac

kazas $ 2 en
proksimume)
url = $ proksimume;
;;
lxer)
url = $ lxer;
;;
esac
Montri $ Montri $ url;

Varianto estas difinita donante ĝin nomon kaj tiam asignante valoron al ĝi. En la supra ekzemplo jenaj variabloj estas:

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

La skripto estas tuj pli regebla per uzanta variablojn. Ekzemple ĉiu parametro estas manipulita aparte kaj do ne ekzistas anoj de IF-aĵoj.

La montra variablo nun agordas ĉu vi elektis ĉion, priskribon aŭ titolon kaj la url-variablon estas difinita al la valoro de la varia variablo aŭ la valoro de la varia variablo de lxer, dependante ĉu vi elektis pridotcom aŭ lxer.

La rsstail-komando nun nur devas uzi la valoron de ekrano kaj url por korekti.

Kvankam variabloj estas starigitaj nur donante al ili nomon, por efektive uzi ilin, vi devas meti $ signon antaŭ ili. Alivorte, variablo = valoro agordas variablon al valoro dum $ variablo signifas doni al mi la enhavon de la variablo.

La sekva estas la fina skripto por ĉi tiu lernilo.

#! / 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 = "uzado: rssget.sh [ĉiuj | priskribo | titolo] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
montri = ""
url = ""

se [$ # -lt 2] || [$ # -gt 2]
tiam
eĥo $ uzado;
eliro;
fi

kazas $ 1 en
ĉio)
display = "- d -l -u"
;;
Priskribo)
montri = "- d -u"
;;
titolo)
montri = "- u"
;;
*)
eĥo $ uzado;
eliro;
;;
esac

kazas $ 2 en
proksimume)
url = $ proksimume;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
ĉiutagaj informoj)
url = $ everydaylinuxuser;
;;
*)
eĥo $ uzado;
eliro;
esac

Montri $ Montri $ url;

La supra skripto enkondukas pli da RSS-fluoj kaj ekzistas uzata variablo, kiu diras al la uzanto kiel uzi la skripton, se ili ne eniras 2 variablojn aŭ ili eniras malĝustajn eblojn por la variabloj.

Resumo

Ĉi tio estis epopea artikolo kaj eble jam tro tro tro baldaŭ. En la sekva gvidilo mi montros al vi ĉiujn komparajn elektojn por IF-a-deklaroj kaj ankoraŭ multe pli paroli pri variabloj.

Ankaŭ ekzistas pli, kio povas fari por plibonigi la supre skripton kaj ĉi tio estos kovrita en estontaj gvidiloj, kiam ni esploros bukojn, grasajn kaj regulajn esprimojn.

Rigardu la sekcion de (Alklaki malsupren preter la kategoriojn por vidi liston de artikoloj) sekcio de l inux.about.com por trovi pli utilajn gvidojn de duobla ekkuro de Windows kaj Ubuntu por starigi virtualan maŝinon uzante GNOME-skatolojn .