Условен оператор if PuppyRus Linux Help System
Условните изрази if (ако), case (in case), while (while) са основните средства за създаване на повече или по-малко разумни скриптове, които избират една от няколко опции в зависимост от условията. Такива оператори присъстват в почти всички разпространени езици за програмиране. Bash не е изключение.
Програмата uxmadplay е замислена по-специално, за да даде на потребителя възможността да избира различни начини за възпроизвеждане на един и същ файл или плейлист, например: да го пусне веднъж или да го повтори за неопределено време, да показва информация за файла на екрана или не и т.н. Следователно използването на условни изрази в uxmadplay беше неизбежно.
Всеки условен оператор на всеки програмен език съдържа два аргумента: условие и команда. Условието е стойността. Може да бъде число, знак или низ. Команда е всяка bash команда или израз или списък от команди.
Условните оператори са изключително важни, тъй като ви позволяват да организирате разклонения в тялото на програмата, например, така:
Както можете да видите, програма, която включва условен оператор, е толкова по-съвършена от обикновен списък с команди, колкото вилицата е по-съвършена от пирон.
Операторът double fork if е най-простият от всички условни оператори.
Най-общо операторът if изглежда така:
В случай на uxmadplay, трябва да направя така, че потребителят да избира дали да показва подробна информация за файла, който се възпроизвежда в прозореца на терминала с madplay или не. Ако е избрал „Извеждане на подробна информация“, тогава стартираме madplay с аргумента „-v“, което всъщност ще направи изхода на madplay подробен. Разклонението на условния оператор изглежда така:
В случай на uxmadplay, за да организирам възпроизвеждане по избор, просто трябва да използвамсамо едно условно твърдение. Факт е, че безкрайното възпроизвеждане на плейлисти е една от лудите функции, просто трябва да я стартирате с аргумента -r:
Това означава, че "-r" може да бъде подаден като аргумент, ако потребителят е избрал повторение или празен низ (""), ако потребителят не го е избрал.
Преамбюл
За да задам въпрос на потребителя, реших да използвам команда, която генерира Xdialog прозорец на екрана. Тази команда може да генерира няколко типа прозорци. В uxmadplay имах нужда от прозорец като "checklist" - български за "списък за избор". За да направите това, просто трябва да стартирате Xdialog с опцията --checklist, последвана от списък за избор, всеки елемент от който изглежда така:
„Избор“ „Име на опция за избор“ „Първоначално избрано“
Като име на опцията записваме произволен низ - това, което потребителят ще види на екрана.
Низът „Първоначално избран“ е или „включен“, или „изключен“. Той казва на Xdialog дали да постави отметка в квадратчето с тази опция предварително ("включено") или не ("изключено").
Низът „Избор“ е стойността, която Xdialog ще ни напише, ако потребителят е избрал тази опция. Запис къде? Към конзолата, от която стартирахме Xdialog. И ако го стартираме не от конзолата, тогава изходният поток няма да отиде никъде. Но използвайки bash оператора "стрелка надясно" - ">" можем да пренасочим изхода към някакъв файл. В този случай към временния файл /tmp/buildlistbox.uxmadplay.tmp.
В bash можете да пренасочите изходния поток към всеки файл и за всяка команда на Linux. Основната красота на Linux е, че почти всичко в системата може да бъде представено като файл. По този начин „стрелката надясно“ е универсален и изключително полезен инструмент.
В горната команда Xdialog само три все още не са обяснени.числа, стоящи подред във втория ред. Те определят размера на прозореца. Опитайте сами да промените стойността им, за да разберете каква е височината и каква е ширината.
Амбула
След като покажем прозореца на Xdialog, искаме да знаем дали потребителят е щракнал върху бутона „OK“, като по този начин е потвърдил избора си, или е променил решението си да отиде по-далеч и е натиснал „Отказ“. Ако щракнете върху "Отказ", Xdialog, след като приключи работата си, като последна дума на умиращия, ще върне числото "255" в командния ред, а в случай на "OK" - ще върне "0". Но, както знаем, нямаме конзола. Така че, за да предадем тези стойности обратно към програмата uxmadplay този път, не като файл, а като променлива, използваме друг bash трик.
Използваме специална променлива с име "?". Стойността му е резултат от изхода на последния работещ процес. Нашият прозорец Xdialog беше последният стартиран процес. Така че променливата "?" съдържа последната дума на Xdialog преди смъртта му. Ако тази дума беше „255“, това означава, че клиентът не е посмял да направи нищо - ние ще завършим работата си.
Забележка: стойността на която и да е променлива в bash може да бъде получена чрез префикс на нейното име със знака за долар "$". Стойността на променливата "A" ще бъде "$A", променливата "?" - съответно "$?"
И нашият код в uxmadplay, който изпълнява това логическо разклонение, изглежда така:
Първо, нека обърнем внимание на израза "изход 1". Командата “изход” означава окончателно и необратимо излизане от програмата, от която е извикана, т.е. от uxmadplay. С други думи, "изход" е самоубийствена команда. Но това до него - това е „последната дума на умиращия“, която току-що използвахме във връзка с Xdialog. И така, командата "изход 1" означава "Ще умра с последната дума - 1". Такаобичайно е те да искат да кажат последната дума, когато нещо в живота не се получи. Същото важи и за програмите. Когато умрат, изпълнили функцията си, те го правят тихо и щастливо. И ако някоя функция не се изпълни, те изпращат дума. В случая с "Xdialog" тази обидна умираща дума беше "255" - три букви (по-точно цифри).
Нула "0" ще бъде казано, ако програмата не казва нищо - това е очевидно.
Както виждаме, използваме низ като условие - стойността на операцията е "не е равна" на стойността на променливата $retval и "0". Низът, който генерира операцията “not equal”, ако се окаже, че е “equal”, значи операторът не е изпълнил функцията си и ще бъде прокълнат със стойност “1”. Ако наистина е „не е равно“, тогава операторът ще умре тихо и стойността на условието ще бъде „0“.
От тук виждаме общото правило: ако низът на условието в оператора if е или с нулева дължина, или равен на "0", тогава условието се счита за изпълнено.
Приложете в bash код (с оператор if и Xdialog) примери 1 и 2.