Водич за почетници за BASH - услови и променливи

Вовед

Добредојдовте во третиот дел од "Водичот за почеток кон BASH". Ако сте ги пропуштиле претходните две статии тогаш веројатно ќе сакате да знаете што го прави овој водич поинаков од другите BASH-скриптирање водичи.

Овој водич е напишан од комплетен почетник до BASH и така како читател што го учиш додека учам. Додека јас сум почетник на BASH Јас доаѓам од развој на софтвер за позадина, иако повеќето од нештата што ги напишав беше за платформата на Windows.

Првите два водичи можете да ги видите со посета:

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

Во ова упатство ќе нагласам како да користам условни изјави за да го тестирате корисничкиот внес и да контролирате како функционира скрипта.

Инсталирај rsstail

За да го следите ова упатство, ќе треба да инсталирате апликација за командната линија наречена rsstail која се користи за читање RSS канали .

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

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

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

yum инсталирај rsstail

За типот openSUSE внесете го следново:

zypper инсталирај rsstail

Изјавата на IF

Отворете терминал и креирајте датотека наречена rssget.sh со внесување на следново:

sudo nano rssget.sh

Во рамките на нано уредникот внесете го следниов текст:

#! / bin / баш
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 скриптата во нано повторно и уредувајте ја датотеката за да погледнете како што следува:

#! / bin / баш

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

Повторете го сценариото со внесување на следново:

sh rssget.sh глас

Овој пат, RSS feedот се враќа со наслов, врска и опис.

Ајде да го анализираме сценариото во малку детали:

# # / Bin / bash се појавува во секоја скрипта што ја пишуваме. Следната линија во основа го разгледува првиот влезен параметар обезбеден од корисникот и го споредува со зборот "глаголи". Ако влезниот параметар и зборот "глаголи" се совпаѓаат со линиите помеѓу тогаш и fi .

Горенаведеното сценарио е очигледно недостатоци. Што се случува ако воопшто не обезбедите влезен параметар? Одговорот е дека добивате грешка по линии на неочекуван оператор.

Другата голема грешка е дека ако не го дадете зборот "глаголи", тогаш ништо не се случува. Идеално, ако не го дадете зборот на глас, сценариото ќе ја врати листата на наслови.

Повторно користете nano за да ја уредите 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;
fi

Зачувајте ја датотеката и стартувајте ја со внесување на следново:

sh rssget.sh глас

Се појавува листа на наслови, описи и врски. Сега стартувајте го повторно како што следува:

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;
fi

Решив да се ослободам од зборот и да го заменам со сите. Тоа не е важен дел. Наведеното сценарио го воведува елифот кој е краток начин да се каже ELSE IF.

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

Ова воведува начин на брзо доаѓање со листа на условни изјави. Алтернативен начин да се направи ELIF е да се користи она што е познато како вгнездени 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;
fi
друго
ако [$ 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;
fi
fi

Слободно можете да го напишете сето она ако сакате или копирајте го и залепете го во вашата датотека rssget.sh.

Горенаведениот скрипт воведува втор параметар кој ви овозможува да изберете или "about.com" или "lxer.com" RSS запис.

За да ја стартувате, внесувате следново:

sh rssget.sh сите околудокот

или

sh rssget.sh сите lxer

Секако можете да ги замените сите со описи или наслови за да дадете само описи или само наслови.

Во суштина кодот погоре вели дека ако вториот параметар е aboutdotcom, тогаш се погледне во втората ако изјава која е иста од претходната скрипта друго, ако вториот параметар е lxer тогаш погледни внатрешниот ако изјава повторно да одлучи дали да се прикажува наслови, описи или сè.

Таа скрипта е претставена чисто како пример на вгнездена изјава на IF и има толку многу работи што не е во ред со тој скрипт, ќе биде потребно уште еден напис за да се објаснат сите нив. Главното прашање е тоа што не е скалабилно.

Замислете дека сакавте да додадете уште еден RSS-запис како секојдневниот Линукс корисник или Линукс денес? Сценариото ќе стане огромно и ако сте одлучиле дека сакате внатрешната изјава на IF да се промени, ќе треба да ја смените на повеќе места.

Додека постои време и место за вгнездени АКО тие треба да се користат повремено. Обично постои начин да го рефорирате вашиот код, така што воопшто не ви треба вгнезден АКО. Јас ќе дојдам на оваа тема во иднина статија.

Ајде сега да погледнеме во решавањето на проблемот со луѓе кои влегуваат во параметри на duff. На пример, во погорната скрипта, ако корисникот влегува во нешто друго освен "aboutdotcom" како втор параметар, тогаш листата на статии се појавуваат од RSS feed од LXER, без оглед на тоа дали корисникот влегува во lxer или не.

Дополнително, ако корисникот не го внесе "сите" или "опис" како прв параметар, тогаш стандардната е листа на наслови кои можат или не се она што корисникот сакал.

Погледнете ја следнава скрипта (или копирајте ја и залепете ја во вашата 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;
fi
друго
ако [$ 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;
fi
fi
fi
fi

Првото нешто што треба да се забележи е дека сценариото сега станува прилично голема и можете брзо да видите како надвор од контрола вгнездени АКО извештаи може да стане.

Бит кој е важен во оваа скрипта е Изјавата на IF || изјава ТОЈ дел на редот 2 и ред 4.

На || се залага за ИЛИ. Значи, ако [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] проверува дали вториот параметар е еднаков на "aboutdotcom" или "lxer". Ако не е, изјавата на IF е завршена, бидејќи не постои друга изјава за надворешното најмногу АКО.

Слично на линијата 4 линијата ако [$ 1 = "all"] || [$ 1 = "опис"] || [$ 1 = "title"] проверува дали првиот параметар е еднаков на "сите" или "опис" или "наслов".

Сега, ако корисникот работи sh rssget.sh сирење од компири, ништо не се враќа, а пред тие да добиле листа на наслови од LXER.

Спротивното од || е &&. Операторот && се залага за AND.

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

#! / bin / баш

ако [$ # -eq2]
тогаш

ако [$ 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;
fi
друго
ако [$ 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;
fi
fi
fi
fi
fi

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

Свесен сум дека ова упатство станува доста големо. Нема многу повеќе да се покријат оваа недела, но сакам да помогнам да ја исчистите сценариото пред да завршиме.

Една последната команда која треба да ја научите за условните изјави е изјавата CASE.

#! / bin / баш


ако [$ # -eq2]
тогаш
случај $ 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

Извештајот за случајот е поубав начин на пишување ако се создаде доколку е во спротивност ако е во прашање.

На пример оваа логика

Ако овошје = банани
ТОГАШ тоа
ОДГОВОРНО ако плодот = портокали
ТОГАШ тоа
ОДГОВОРНО ако плодот е грозје
ТОГАШ тоа
КРАЈ АКО

може да се препишува како:

случај овошје во
банани)
направете го тоа
;;
портокали)
направете го тоа
;;
грозје)
направете го тоа
;;
esac

Во основа, првата точка по случајот е она што ќе го споредите (т.е. овошјето). Потоа, секоја ставка пред заградите е она што го споредувате и ако се поклопува со претходните линии ;; ќе се трча. Изјавата за случајот е завршена со обратен есек (што е случај случај назад).

Во rssget.sh скриптата изјавата на случајот отстранува дел од тоа ужасно гнездење, иако не го подобрува доволно.

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

Погледнете го следниов код:

#! / bin / баш

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

ако [$ # -lt 2] || [$ # -gt2]
тогаш
echo "употреба: rssget.sh [сите | опис | наслов] [aboutdotcom | lxer]";
излез;
fi

случај $ 1 внатре
сите)
приказ = "- d -l -u"
;;
опис)
дисплеј = "- d-u"
;;
Наслов)
дисплеј = "- 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"
usage = "употреба: rssget.sh [сите | опис | наслов] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
дисплеј = ""
url = ""

ако [$ # -lt 2] || [$ # -gt2]
тогаш
ехо $ употреба;
излез;
fi

случај $ 1 внатре
сите)
приказ = "- d -l -u"
;;
опис)
дисплеј = "- d-u"
;;
Наслов)
дисплеј = "- u"
;;
*)
ехо $ употреба;
излез;
;;
esac

случај $ 2 внатре
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
everydaylinuxuser)
url = $ everydaylinuxuser;
;;
*)
ехо $ употреба;
излез;
esac

rsstail $ приказ $ url;

Горенаведениот скрипт воведува повеќе RSS канали и има променлива за користење која му кажува на корисникот како да го користи скрипта ако тие не внесуваат две променливи или внесуваат неточни опции за променливите.

Резиме

Ова е епски напис и можеби прерано е прерано. Во следното упатство ќе ви ги покажам сите опции за споредба за изјавите на IF и има уште многу повеќе за разговор во врска со променливите.

Исто така, има повеќе што може да се направи за да се подобри горенаведениот скрипт и ова ќе биде опфатено во идните водичи додека ги истражуваме петелките, grep и регуларните изрази.

Проверете го Како да (Преместете по минатото на категориите за да видите листа на статии) дел од l inux.about.com за да најдете повеќе корисни водичи од двојно подигнување на Windows и Ubuntu за поставување на виртуелна машина со користење на GNOME-кутии .