Кіраўніцтва для пачаткоўцаў BASH - Умовы і зменныя

ўвядзенне

Сардэчна запрашаем у трэцюю частку «Кіраўніцтва для пачаткоўца BASH». Калі вы прапусцілі папярэднія два артыкулы, то вы, верагодна, хочаце ведаць, што робіць дадзенае кіраўніцтва адрозніваецца ад іншых кіраўніцтваў BASH сцэнарыяў.

Гэта кіраўніцтва пішацца поўны пачатковец у BASH і так як чытач вы даведаецеся, як я даведаўся. Нягледзячы на ​​тое, што я пачатковец у BASH Я родам з фону распрацоўкі праграмнага забеспячэння, хоць вялікая частка матэрыялу, які я напісаў ужо для платформы Windows.

Вы можаце бачыць першыя дзве накіроўвалыя, наведаўшы:

Калі вы пачатковец у BASH сцэнарыяў я рэкамендую прачытаць першыя дзве накіроўвалыя, перш чым працягнуць з гэтым.

У гэтым кіраўніцтве я буду падсвятленне, як выкарыстоўваць ўмоўныя аператары для ўводу карыстацкага тэставання і кантролю, як функцыі сцэнара.

ўсталяваць rsstail

Для таго , каб прытрымлівацца гэтага кіраўніцтву вам неабходна будзе ўсталяваць прыкладанне з каманднага радка з імем rsstail , якая выкарыстоўваецца для чытання RSS - каналаў .

Калі вы выкарыстоўваеце Debian / Ubuntu / Mint тып размеркавання на аснове наступных:

Sudo APT-атрымаць ўстаноўку rsstail

Для Fedora / CentOS і г.д. увядзіце наступную каманду :

ні ўсталяваць rsstail

Для OpenSUSE тыпу наступнае:

Zypper ўсталяваць rsstail

IF заяву

Адкрыйце тэрмінал і стварыце файл з імем rssget.sh, увёўшы наступнае:

Судо нана rssget.sh

У рэдактары нана увядзіце наступны тэкст:

#! / Bin / Баш
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Захавайце яго, націснуўшы CTRL і O, а затым выйсці, націснуўшы CTRL і X.

Выканайце сцэнар, увёўшы наступнае:

ш rssget.sh

Сцэнар будзе вяртаць спіс назваў з linux.about.com RSS корму.

Гэта не занадта карысны скрыпт, таму што ён проста здабывае загалоўкі з аднаго RSS Тыдала, але гэта захаваць, каб памятаць шлях да Linux.about.com RSS-канал.

Адкрыйце сцэнар rssget.sh ў нана зноў і рэдагаваць файл выглядаць наступным чынам:

#! / Bin / Баш

калі [$ 1 = "шматслоўны"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
фі

Запусціце скрыпт зноў, увёўшы наступнае:

ш rssget.sh шматслоўным

На гэты раз RSS падача вяртаецца з назвай, спасылкай і апісаннем.

Давайце прааналізуем сцэнар трохі падрабязней:

#! / Bin / Баш з'яўляецца ў кожным сцэнары мы пішам. Наступная радок у асноўным глядзіць на першы ўваходных параметр, прадстаўленай карыстальнікам, і параўноўвае яго са словам «шматслоўным». Калі ўваходны параметр і слова «шматслоўны» адпавядае лініі паміж тады і фі пабег.

Вышэй сцэнар відавочна сапсаваны. Што адбудзецца, калі вы не забяспечваюць ўваходны параметр на ўсіх? Адказ вы атрымаеце памылку ўздоўж ліній нечаканага аператара.

Іншы галоўны недахоп заключаецца ў тым, што калі вы не падасце слова «шматслоўны», то нічога не адбываецца наогул. У ідэале, калі вы не падасце слова шматслоўным скрыпт будзе вяртаць спіс назваў.

Выкарыстанне нана зноў адрэдагаваць файл rssget.sh і змяніць код наступным чынам:

#! / Bin / Баш

калі [$ 1 = "шматслоўны"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі

Захавайце яго і запусціць яго, набраўшы наступнае:

ш rssget.sh шматслоўным

З'явіцца спіс назваў, апісанняў і спасылак. Зараз запусціце яго зноў наступным чынам:

Назвы ш rssget.sh

На гэты раз толькі спіс назваў з'яўляецца.

Дадатковая частка сцэнара ў радку 4 і ўводзіць справаздачу яшчэ. У прынцыпе сцэнар цяпер кажа, калі першы параметр з'яўляецца слова «шматслоўны» атрымаць апісанне, спасылкі і загалоўкі для RSS-канал, але калі першы параметр ўсё астатняе проста атрымаць спіс назваў.

Сцэнар крыху палепшылася, але ўсё яшчэ сапсаваны. Калі вы не ў стане ўвесці параметр, вы ўсё роўна атрымаеце памылку. Нават калі вы падасце параметр, проста кажу, што вы не хочаце, шматслоўным не азначае, што вы хочаце толькі загалоўкі. Вы, магчыма, толькі пішацца шматслоўным няправільна, напрыклад, ці вы можаце надрукавалі галубоў, якія, вядома, бессэнсоўна.

Перад тым, як паспрабаваць ачысціць гэтыя пытанні, я хачу паказаць вам яшчэ адну каманду, якая ідзе з сцвярджэннем IF.

Рэдагаваць rssget.sh сцэнар выглядаць наступным чынам:

#! / Bin / Баш

калі [$ 1 = "усё"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі

Я вырашыў пазбавіцца ад слова шматслоўным і замяніць яго з усімі. Гэта не з'яўляецца важнай часткай. Сцэнар вышэй ўводзіць Эліф , які з'яўляецца кароткім спосабам сказаць ELSE IF.

Цяпер скрыпт працуе наступным чынам. Калі запусціць ш rssget.sh ўсё , то вы атрымаеце апісанне, спасылку і загалоўкі. Калі замест гэтага вы проста запусціць ш апісанне rssget.sh вы атрымаеце толькі назвы і апісання. Калі паставіць любое іншае слова, якое вы атрымаеце спіс назваў.

Гэта ўводзіць спосаб хутка прыдумляе спіс умоўных аператараў. Альтэрнатыўны спосаб зрабіць Эліф гэта выкарыстоўваць тое, што вядома як укладзеная IF заявы.

Ніжэй прыведзены прыклад, які паказвае, як укладзены IF заяву працы:

#! / Bin / Баш

калі [$ 2 = "aboutdotcom"]
то
калі [$ 1 = "усё"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
яшчэ
калі [$ 1 = "усё"]
то
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
фі

Вы можаце надрукаваць усё, што, калі вам падабаецца ці скапіяваць і ўставіць яго ў свой файл rssget.sh.

Дадзены скрыпт ўяўляе 2-й параметр, які дазваляе выбраць альбо «About.com» або «lxer.com» у RSS-канал.

Каб запусціць яго, вы увядзіце наступнае:

ш rssget.sh ўсе aboutdotcom

або

ш rssget.sh ўсе lxer

Вядома, Вы можаце замяніць усе з апісаннямі і назвамі, каб забяспечыць толькі апісанне або толькі назва.

У асноўным код вышэй кажа, што калі другі параметр aboutdotcom затым паглядзець на другім, калі заяву, у якім той жа адзін з папярэдняга сцэнара яшчэ, калі другі параметр lxer затым паглядзець на ўнутраным, калі заява яшчэ раз, каб вырашыць, ці трэба паказваць назвы, апісанне або ўсё.

Гэты сцэнар прадастаўляецца выключна ў якасці прыкладу укладзенай IF заявы і ёсць так шмат рэчаў няправільна з гэтым сцэнаром было б узяць яшчэ адзін артыкул, каб растлумачыць іх усё. Асноўная праблема заключаецца ў тым, што яна не з'яўляецца маштабуецца.

Уявіце, што вы хацелі, каб дадаць яшчэ адзін RSS-канал, такія як Everyday Linux User або Linux Today? Сцэнар стаў бы велізарным, і калі вы вырашылі, што вы хацелі ўнутраны IF заявы для змены вы павінны змяніць яго ў некалькіх месцах.

Хоць ёсць месца і час для укладзеная IF яны павінны выкарыстоўвацца эканомна. Існуе, як правіла спосаб рэарганізаваць код так, што вам не трэба укладзеная IF наогул. Я прыйду на гэтую тэму ў наступным артыкуле.

Давайце зараз паглядзім на фіксуючы праблему людзей, якія ўваходзяць параметры Даф. Напрыклад, у сцэнары вышэй, калі карыстальнік ўводзіць нешта іншае, чым «aboutdotcom» ў якасці 2-га параметру затым спіс артыкулаў з'яўляюцца з RSS стужкі з LXER незалежна, каб карыстачу ўводзіць Ці lxer ці не.

Акрамя таго, калі карыстальнік не ўвядзе «усё» або «апісання" ў якасці 1-га параметру, то па змаўчанні спіс назваў, якія могуць быць ці не быць задумай карыстальніка.

Паглядзіце на наступны скрыпт (або скапіяваць і ўставіць яго ў свой файл rssget.sh.

#! / Bin / Баш

калі [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
то
калі [$ 1 = "усё"] || [$ 1 = "апісанне"] || [$ 1 = "назва"]
то
калі [$ 2 = "aboutdotcom"]
то

калі [$ 1 = "усё"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
яшчэ
калі [$ 1 = "усё"]
то
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
фі
фі
фі

Першае, што трэба адзначыць, што сцэнар цяпер атрымлівае даволі вялікі, і вы можаце хутка ўбачыць, як з-пад кантролю ўкладзеных IF заявы можа стаць.

Біт, што мае важнае значэнне ў гэтым сцэнары з'яўляецца зацвярджэнне IF || Заява ТАДЫ раздзел па лініі 2 і 4.

|| азначае OR. Такім чынам, лінія , калі [$ 2 = "aboutdotcom"] || [$ 2 = «lxer»] правярае , ці знаходзіцца другі параметр роўны «aboutdotcom» або «lxer». Калі гэта не так, то зацвярджэнне IF з'яўляецца поўным , таму што няма іншага заявы для вонкавага большасці IF.

Дакладна так жа ў радку 4 лініі , калі [$ 1 = «ўсё»] || [$ 1 = "апісанне"] || [$ 1 = «загаловак»] правярае , ці знаходзіцца першы параметр роўны альбо «ўсё» або «апісанне» або «назоў».

Цяпер , калі карыстальнік не працуе SH rssget.sh бульбачка сыр нічога вяртаецца тады , перш чым яны атрымалі б спіс назваў з LXER.

супрацьлегласць || з'яўляецца &&. Аператар && азначае AND.

Я збіраюся зрабіць сцэнар выглядаць яшчэ больш падобным на кашмар, але гэта робіць усю важную праверку, каб пераканацца, што карыстальнік падаў 2 параметру.

#! / Bin / Баш

калі [$ # -eq 2]
то

калі [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
то
калі [$ 1 = "усё"] || [$ 1 = "апісанне"] || [$ 1 = "назва"]
то
калі [$ 2 = "aboutdotcom"]
то

калі [$ 1 = "усё"]
то
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
яшчэ
калі [$ 1 = "усё"]
то
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
Эліф [$ 1 = "Апісанне"]
то
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
яшчэ
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
фі
фі
фі
фі
фі

Адзіны біт , які з'яўляецца дадатковым ў гэтым сцэнары яшчэ адзін вонкавы IF заяву наступным чынам : калі [$ # -eq 2]. Калі вы чыталі артыкул пра ўваходныя параметрах вы будзеце ведаць, што $ # вяртае лічыльнік колькасці ўваходных параметраў. -eq выступае за роўныя. Такім чынам, аператар IF правярае, што карыстач увёў 2 параметраў, і калі яны не зрабілі гэта проста выходзіць, нічога не робячы. (Не асабліва прыязна).

Я ведаю, што гэты падручнік становіцца даволі вялікім. Існуе не так шмат больш, каб пакрыць на гэтым тыдні, але я хачу, каб дапамагчы прывесці ў парадак сцэнар, перш чым мы скончым.

Адна апошняя каманда, якую вы павінны даведацца аб умоўных аператараў з'яўляецца сазе.

#! / Bin / Баш


калі [$ # -eq 2]
то
Выпадак $ 2 у
aboutdotcom)
Выпадак $ 1 у
усе)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
апісанне)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
назва)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
ESAC
;;
lxer)
Выпадак $ 1 у
усе)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
апісанне)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
назва)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
ESAC
;;
ESAC
фі

Сазе з'яўляецца больш добрым спосабам напісання IF ELSE IF ELSE IF ELSE IF.

Напрыклад, гэта лагічны

Калі садавіна = бананы
ТАДЫ гэта
ELSE IF садавіна = апельсіны
ТАДЫ гэта
ELSE IF садавіна = вінаград
ТАДЫ гэта
END IF

можна перапісаць у выглядзе:

выпадак садавіны ў
бананы)
зрабіць гэта
;;
апельсіны)
зрабіць гэта
;;
вінаград)
зрабіць гэта
;;
ESAC

У асноўным першы элемент пасля справы з'яўляецца, што вы збіраецеся параўноўваць (г.зн. садавіна). Тады кожны элемент перад дужкамі гэта тое, што вы параўноўваеце супраць і, калі ён адпавядае лініі папярэдняй ;; будзе пабег. Выпадак заяву спыняецца з зваротным ESAC (які з'яўляецца выпадак, у зваротным кірунку).

У rssget.sh скрыпце выпадку аператар выдаляе некаторыя з гэтага жудаснага ўкладзенасці, хоць на самай справе не паляпшаючы яго дастаткова.

Для таго, каб сапраўды палепшыць сцэнар, мне трэба, каб пазнаёміць вас з зменнымі.

Паглядзіце на наступны код:

#! / Bin / Баш

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
Дысплей = «»
URL = ""

калі [$ # -lt 2] || [$ # -gt 2]
то
рэха "выкарыстання: rssget.sh [усе | Апісанне | TITLE] [aboutdotcom | lxer]";
выхад;
фі

Выпадак $ 1 у
усе)
дысплей = "- в -l -u"
;;
апісанне)
дысплей = "- d -u"
;;
назва)
дысплей = «- і»
;;
ESAC

Выпадак $ 2 у
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
ESAC
rsstail $ дысплей $ URL;

Пераменная вызначаецца надаючы ёй імя, а затым прысваенне значэння да яго. У прыведзеным вышэй прыкладзе Ніжэй прыведзены зменныя заданні:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
Дысплей = «»
URL = ""

Сцэнар імгненна больш кіраваным з дапамогай зменных. Напрыклад кожны параметр апрацоўваецца асобна, і таму няма укладзенай IF заявы.

Пераменная дысплей цяпер усталёўваецца ў залежнасці ад таго, выбралі Ці вы, апісанне або назва і зменная URL усталёўваецца на гэтае значэньне aboutdotcom ці значэнне зменнай lxer у залежнасці выбралі Ці вы aboutdotcom або lxer.

Каманда rsstail зараз проста павінен выкарыстаць значэнне адлюстравання і URL для карэктнай працы.

У той час як зменныя ўсталёўваюцца толькі, даючы ім назву, на самай справе выкарыстаць іх, вы павінны паставіць знак $ перад імі. Іншымі словамі пераменная = значэнне ўсталёўвае зменную ў значэнне, у той час як $ рэгуляваныя сродак даць мне змесціва зменнай.

Ніжэй канчатковы сцэнар для гэтага ўрока.

#! / Bin / Баш

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"
выкарыстанне = "выкарыстанне: rssget.sh [усе | Апісанне | назву] [lxer | aboutdotcom | everydaylinuxuser | LinuxToday]"
Дысплей = «»
URL = ""

калі [$ # -lt 2] || [$ # -gt 2]
то
Рэха $ выкарыстанне;
выхад;
фі

Выпадак $ 1 у
усе)
дысплей = "- в -l -u"
;;
апісанне)
дысплей = "- d -u"
;;
назва)
дысплей = «- і»
;;
*)
Рэха $ выкарыстанне;
выхад;
;;
ESAC

Выпадак $ 2 у
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
LinuxToday)
URL = $ LinuxToday;
;;
everydaylinuxuser)
URL = $ everydaylinuxuser;
;;
*)
Рэха $ выкарыстанне;
выхад;
ESAC

rsstail $ дысплей $ URL;

Дадзены скрыпт ўводзіць больш RSS-каналы, і ёсць выкарыстанне зменнай, якая паведамляе карыстачу, як выкарыстоўваць сцэнар, калі яны альбо не ўваходзяць 2 зменныя, або яны ўведзеныя няправільныя параметры для зменных.

рэзюмэ

Гэта была эпічная артыкул, і, магчыма, зайшла занадта далёка і занадта хутка. У наступным кіраўніцтве я пакажу вам свае варыянты параўнання для IF заяў і ёсць яшчэ шмат пра што пагаварыць з адносна зменных.

Існуе таксама больш , што можна зрабіць , каб палепшыць вышэй сцэнар , і гэта будзе разглядацца ў будучых гідаў , як мы даследуем цыклы, Grep і рэгулярныя выразы.

Ад'езд Як (Прагортка ўніз міма катэгорый , каб убачыць спіс артыкулаў) падзел л inux.about.com знайсці больш карысныя даведнікі ад двайны загрузкі Windows , і Ubuntu для стварэння віртуальнай машыны з дапамогай акна GNOME .