Skip to main content

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

Supersection 1, More Comfortable (Април 2025)

Supersection 1, More Comfortable (Април 2025)
Anonim

Въведение

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

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

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

  • Ръководство за начинаещи за BASH - Здравей свят
  • Ръководство за начинаещи за BASH - Параметри за въвеждане

Ако сте нови за 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" съвпадат с линиите между тях тогава и Fi са избягали.

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

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

Използвайте отново нано, за да редактирате файла 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 и въвежда още изявление. По принцип в скрипта се казва, че ако първият параметър е думата "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 всичко след това получавате описания, връзки и заглавия. Ако вместо това просто тичате од 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; FiFi

Чувствайте се свободни да въведете всичко това, ако харесвате, или да го копирате и поставите във вашия 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 FiFi

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

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

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

По същия начин на линия 4 линията ако $ 1 = "всички" || $ 1 = "описание" || $ 1 = "заглавие"проверява дали първият параметър е равен на "всички" или "описание" или "заглавие".

Сега, ако потребителят работи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 FiFi

Единственият бит, който е допълнителен в този скрипт, е друг външен 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 ;; ESACFi

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

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

АКО Плодовете = бананиСлед това товаЕЛЕКС АКО плодът = портокалиСлед това товаЕЛЕКС АКО Плодове = гроздеСлед това това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; ;;ESACrsstail $ Показване на $ 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 и регулярни изрази.

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