Ръководство за начинаещи за BASH - условия и променливи

Въведение

Добре дошли в третата част на "Ръководство за начинаещи за BASH". Ако сте пропуснали предишните две статии, вероятно ще искате да знаете какво прави това ръководство различно от другите BASH ръководства за скриптове.

Това ръководство е написано от пълен начинаещ на BASH и така като читател, който научавате, докато се уча. Докато съм начинаещ в BASH, идвам от фона на разработката на софтуер, въпреки че повечето неща, които написах, са за платформата на Windows.

Можете да видите първите два ръководства, като посетите:

Ако сте нови за BASH скрипторите, препоръчвам да прочетете първите два ръководства, преди да продължите с това.

В това ръководство ще изтъкна как да се използват условни изявления, за да се тестват входовете на потребителите и да се контролира как функционират скриптовете.

Инсталирайте rsstail

За да следвате това ръководство, ще трябва да инсталирате приложение за команден ред, наречено rsstail, което се използва за четене на RSS емисии .

Ако използвате типа разпространение на базата на Debian / Ubuntu / Mint, следното:

sudo apt-get инсталирате rsstail

За Fedora / CentOS и т.н. въведете следното:

yum install rsstail

За тип openSUSE :

zypper install rsstail

Изявлението IF

Отворете терминала и създайте файл, наречен rssget.sh, като въведете следното:

sudo nano rssget.sh

В нано редактора въведете следния текст:

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

Запишете файла, като натиснете CTRL и O, след което излезте, като натиснете CTRL и X.

Стартирайте скрипта, като въведете следното:

sh rssget.sh

Сценарият ще върне списък с заглавия от RSS feed на linux.about.com.

Това не е прекалено полезен скрипт, тъй като то просто извлича заглавията от една RSS емисия, но не спасявайки да запомните пътя към RSS feed на Linux.about.com.

Отворете отново rssget.sh скрипта в нано и редактирайте файла, така че да изглежда по следния начин:

#! / хамбар / Баш

ако [$ 1 = "verbose"]
тогава
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
Fi

Стартирайте отново скрипта, като въведете следното:

sh rssget.sh verbose

Този път RSS feed се връща с заглавие, връзка и описание.

Нека анализираме сценария с малко подробности:

#! / Bin / bash се показва във всеки скрипт, който пишем. Следващият ред основно разглежда първия входен параметър, предоставен от потребителя, и го сравнява с думата "verbose". Ако входният параметър и думата "verbose" съвпадат с линиите между тях и файловете .

Горният сценарий е очевидно недостатък. Какво се случва, ако изобщо не въведете входния параметър? Отговорът е, че получавате грешка по линията на неочакван оператор.

Другият основен недостатък е, че ако не дадете думата "подробно", нищо не се случва изобщо. В идеалния случай, ако не предоставите думата по-подробно, скриптът ще върне списък с заглавия.

Използвайте отново нано, за да редактирате файла rssget.sh и променете кода, както следва:

#! / хамбар / Баш

ако [$ 1 = "verbose"]
тогава
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;
Fi

Запишете файла и го стартирайте, като въведете следното:

sh rssget.sh verbose

Ще се появи списък с заглавия, описания и връзки. Сега го стартирайте отново, както следва:

sh rssget.sh заглавия

Този път се появява списък с заглавия.

Допълнителната част на скрипта е на линия 4 и въвежда изявлението else . По принцип в скрипта се казва, че ако първият параметър е думата "verbose", ще получите описанието, връзките и заглавията за RSS канала, но ако първият параметър е нещо друго, просто се получи списък с заглавия.

Сценарият се е подобрил леко, но все още е недостатък. Ако не успеете да въведете параметър, пак ще получите грешка. Дори и ако ви предоставим параметър, просто като казвате, че не искате повече, не означава, че искате само заглавия. Вероятно току-що сте изписали грешно погрешно например или може да сте въвели гълъби, което разбира се е безсмислено.

Преди да се опитаме да изчистим тези проблеми, искам да ви покажа още една команда, която върви с изявлението IF.

Редактирайте скрипта rssget.sh, за да изглеждате както следва:

#! / хамбар / Баш

ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 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;
Fi

Реших да се отърва от думата и да я заместя с всички. Това не е важната част. Сценарият по-горе въвежда елиф, който е кратък начин да кажеш ELSE IF.

Сега сценарият работи както следва. Ако пуснете sh rssget.sh всичко, тогава ще получите описания, връзки и заглавия. Ако вместо това просто тичам sh rssget.sh описание, ти просто ще получиш заглавия и описания. Ако предоставите друга дума, ще получите списък с заглавия.

Това въвежда начин бързо да излезе със списък на условните изявления. Алтернативен начин за правене на ELIF е да използвате това, което е известно като вложени IF отчети.

Следващото е пример, показващ как функционират вложените IF отчети:

#! / хамбар / Баш

ако [$ 2 = "aboutdotcom"]
тогава
ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 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;
Fi
още
ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогава
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
още
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi

Чувствайте се свободни да въведете всичко това, ако харесвате, или да го копирате и поставите във вашия rssget.sh файл.

В горния скрипт е въведен 2-ри параметър, който ви позволява да избирате "about.com" или "lxer.com" като RSS емисия.

За да го стартирате, въведете следното:

sh rssget.sh всичко за dotcom

или

sh rssget.sh всички lxer

Разбира се, можете да замените всички с описания или заглавия, за да предоставите само описания или само заглавия.

По принцип кодът по-горе казва, че ако вторият параметър е aboutdotcom, погледнете втория if statement, който е същият от предходния скрипт, ако вторият параметър е lxer, тогава погледнете вътрешния if statement отново, за да решите дали да показвате заглавия, описания или всичко.

Този скрипт е предоставен само като пример за вложено IF изявление и има толкова много неща, които не са наред с този скрипт, че ще се наложи друга статия, за да ги обясним всички. Основният проблем е, че той не е мащабируем.

Представете си, че искате да добавите още RSS емисии като всекидневен Linux потребител или Linux днес? Сценарият ще стане огромен и ако сте решили, че искате вътрешното IF изявление да се промени, ще трябва да го промените на няколко места.

Докато има време и място за вложени, те трябва да се използват умерено. Обикновено има начин да преопаковате кода си, така че изобщо да не се нуждаете от вложените инструменти. Ще отговоря на този въпрос в бъдеща статия.

Нека сега да разгледаме въпроса за навлизането на хора в параметрите на дуфа. Например в скрипта по-горе, ако потребителят въведе нещо различно от "aboutdotcom" като 2-ри параметър, тогава списък от статии се показва от RSS емисията от LXER, независимо дали потребителят въвежда lxer или не.

Освен това, ако потребителят не въведе "всички" или "описание" като 1-ва параметър, тогава по подразбиране е списък с заглавия, които могат или не са предназначени за потребителя.

Вижте следващия скрипт (или го копирайте и го поставете във вашия rssget.sh файл.

#! / хамбар / Баш

ако [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
тогава
ако [$ 1 = "всички"] || [$ 1 = "описание"] || [$ 1 = "заглавие"]
тогава
ако [$ 2 = "aboutdotcom"]
тогава

ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 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;
Fi
още
ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогава
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
още
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi
Fi
Fi

Първото нещо, което трябва да се отбележи е, че сценарият вече е доста голям и можете бързо да видите как извън контрола вложени IF изявления могат да станат.

Битът, който е важен в този скрипт, е изразът IF || изречение THEN раздел на ред 2 и ред 4.

В || означава OR. Така че линията, ако [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] проверява дали вторият параметър е равен на "aboutdotcom" или "lxer". Ако това не е тогава IF изявление е пълна, защото няма друго изявление за най-външния IF.

По същия начин на линия 4 линията, ако [$ 1 = "all"] || [$ 1 = "описание"] || [$ 1 = "title"] проверява дали първият параметър е равен на "all" или "description" или "title".

Сега, ако потребителят работи sh rssget.sh сирене картофи нищо не се връща, докато преди те ще са получили списък на заглавията от LXER.

Обратното на || е &&. Операторът && означава AND.

Аз ще направя сценария да изглежда още повече като кошмар, но прави всичко важно, за да се уверите, че потребителят е предоставил 2 параметъра.

#! / хамбар / Баш

ако [$ # -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;
elif [$ 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;
Fi
още
ако [$ 1 = "всички"]
тогава
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "описание"]
тогава
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
още
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Fi
Fi
Fi
Fi
Fi

Единственият бит, който е допълнителен в този скрипт, е друг външен IF израз, както следва: ако [$ # -eq 2] . Ако прочетете статията за входните параметри, ще знаете, че $ # връща броя на входните параметри. -eq означава равен. Поради това изявлението на IF проверява дали потребителят е въвел 2 параметъра и ако не го е излязъл, без да прави нищо. (Не особено приятелски).

Аз съм наясно, че този урок става доста голям. Тази седмица няма много повече да се занимавам, но искам да помогна за подреждането на сценария, преди да завършим.

Последната команда, която трябва да научите за условните твърдения, е изразът CASE.

#! / хамбар / Баш


ако [$ # -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
Fi

Изявлението за делото е по-хубав начин за писане, ако друго, ако друго, ако друго, ако.

Например тази логика

АКО Плодовете = банани
След това това
ЕЛЕКС АКО плодът = портокали
След това това
ЕЛЕКС АКО Плодове = грозде
След това това
END IF

може да бъде пренаписан като:

плодовете на кутията в
банани)
направите това
;;
портокали)
направите това
;;
грозде)
направите това
;;
ESAC

По принцип първият елемент след случая е нещо, което ще сравнявате (т.е. плодове). След това всеки елемент пред скобите е това, което сравнявате и ако то съвпада с предходните редове ;; ще се завтече. Делото се прекратява с обратната есен (което е обратното).

В скрипта rssget.sh изявлението на делото премахва някои от тези ужасяващи гнезда, макар че не го подобрява достатъчно.

За да подобря действително сценария, трябва да ви запозная с променливите.

Вижте следния код:

#! / хамбар / Баш

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

ако [$ # -lt 2] || [$ # -гт 2]
тогава
ехо "използване: rssget.sh [всички | описание | заглавие] [aboutdotcom | lxer]";
изход;
Fi

случай $ 1 в
всичко)
показване = "- d -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 в зависимост от това дали сте избрали fordotcom или lxer.

Командата rsstail сега просто трябва да използва стойността на дисплея и url, за да работи правилно.

Докато променливите се задават само като им се даде име, за да ги използвате, трябва да поставите знак $ пред тях. С други думи, променливата = стойността задава променлива до стойност, докато променливата $ означава да ми дадете съдържанието на променливата.

Следващото е крайният скрипт за този урок.

#! / хамбар / Баш

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] || [$ # -гт 2]
тогава
echo $ usage;
изход;
Fi

случай $ 1 в
всичко)
показване = "- d -l-u"
;;
описание)
показване = "- d -u"
;;
заглавие)
показване = "- ф"
;;
*)
echo $ usage;
изход;
;;
ESAC

случай $ 2 в
aboutdotcom)
URL = $ aboutdotcom;
;;
lxer)
URL = $ lxer;
;;
linuxtoday)
URL = $ linuxtoday;
;;
everydaylinuxuser)
URL = $ everydaylinuxuser;
;;
*)
echo $ usage;
изход;
ESAC

rsstail $ Показване на $ url;

Горният скрипт въвежда повече RSS емисии и има потребителска променлива, която казва на потребителя как да използва скрипта, ако не въведе 2 променливи или въведе неправилни опции за променливите.

резюме

Това е епична статия и може да е прекалено прекалено скоро. В следващото ръководство ще ви покажа всички опции за сравнение за изявленията на IF и има още много неща, за които да се говори по отношение на променливите.

Има още много неща, които могат да се направят, за да се подобри горния скрипт и това ще бъде обхванато в бъдещи ръководства, докато разглеждаме цикли, grep и регулярни изрази.

Разгледайте раздела "Как да" (Превъртете надолу по категориите, за да видите списък с статии) в l inux.about.com, за да намерите по-полезни ръководства от двойно зареждане на Windows и Ubuntu, за да настроите виртуална машина, използваща кутии на GNOME .