Умовний оператор if Довідкова система PuppyRus Linux
Умовні оператори if (якщо), case (у разі), while (поки що) — основний засіб для створення більш менш розумних скриптів, які вибирають один з декількох варіантів дій залежно від умов. Такі оператори є майже у всіх поширених мовах програмування. Bash - не виняток.
Програма uxmadplay замислювалася, зокрема, для того, щоб дати користувачеві можливість вибирати різні способи відтворення одного і того ж файлу або плейлиста, наприклад: програти його одноразово або повторювати до нескінченності, виводити інформацію про файл на екран або не виводити, і т.д. . Тому використання умовних операторів у uxmadplay було неминуче.
Будь-який умовний оператор у будь-якій мові програмування містить два аргументи: умова та команду. Умова – це значення. Це може бути числом, символом або рядком. Команда – це будь-яка команда або оператор bash або список команд.
Умовні оператори дуже важливі, оскільки вони дозволяють влаштувати розгалуження в тілі програми, наприклад, так:
Як видно, програма, що включає умовний оператор настільки досконаліший за простий список команд, наскільки вилка досконаліша за цвях.
Оператор if - подвійна вилка - найпростіший з усіх умовних операторів.
Загалом, запис оператора if виглядає так:
У випадку uxmadplay мені треба зробити так, щоб користувач вибрав, чи виводити докладну інформацію про файл, що грається, у вікно терміналу з madplay чи ні. Якщо він вибрав "Виводити докладну інформацію", то запускаємо madplay з аргументом "-v", що, власне, і зробить висновок madplay докладним. Виделка умовного оператора виглядає так:
У випадку uxmadplay, щоб влаштувати програвання на вибір, мені достатньо використовуватилише один умовний оператор. Справа в тому, що нескінченне відтворення плейлиста - одна з функцій madplay, варто тільки її запустити з аргументом -r:
Отже, як аргумент можна передати «-r», якщо користувач вибрав повтор або порожній рядок (»»), якщо користувач його не вибрав.
Преамбула
Щоб поставити запитання користувачеві, я вирішив використати команду, яка генерує на екрані вікно Xdialog. Ця команда може генерувати кілька типів вікон. У uxmadplay мені потрібне було вікно типу «checklist» — українською мовою «список для вибору». Для цього треба просто запустити Xdialog з опцією --checklist, за якою видамо список для вибору, кожен елемент якого має вигляд:
«Вибір» «Назва опції для вибору» «Вихідновибрано»
Як назву опції ми записуємо будь-який рядок — те, що користувач побачить на екрані.
Рядок «Вихідновибрано» має значення або «on», або «off». Вона повідомляє Xdialog, поставити галочку в квадратик з цією опцією заздалегідь (on) чи ні (off).
Рядок "Вибір" - це те значення, яке нам запише Xdialog, якщо користувач вибрав цю опцію. Запише куди? У консоль, з якої ми запустили Xdialog. А якщо ми запускаємо його не з консолі, то потік виведення піде в нікуди. Але використовуючи оператор bash "права стрілка" - ">" ми можемо перенаправити висновок у якийсь файл. В даному випадку – у тимчасовий файл /tmp/buildlistbox.uxmadplay.tmp.
У bash перенаправити потік виведення можна до будь-якого файлу і для будь-якої команди Лінукса. Головна принадність Лінукса полягає в тому, що майже все в системі може бути представлене як файл. Таким чином, "права стрілка" - універсальний і вкрай корисний інструмент.
У наведеній команді Xdialog не пояснено поки що лише трициферки, що стоять поспіль у другому рядку. Вони визначають розмір вікна. Спробуйте самостійно змінювати їхнє значення, щоб зрозуміти, що в них висота, а що – ширина.
Амбула
Після того, як ми вивели на екран вікно Xdialog, ми хочемо дізнатися, чи натиснув користувач на кнопку "ОК", тим самим підтвердивши вибір, або передумав йти далі і натиснув "Cancel". У разі натискання Cancel Xdialog, після завершення своєї роботи, на правах останнього слова вмираючого, поверне в командний рядок число 255, а у випадку ОК поверне 0. Але, як ми знаємо, консолі в нас немає. Тому, щоб передати ці значення цього разу не у файл, а у вигляді змінної назад у програму uxmadplay, ми використовуємо інший, ще один трюк bash.
Ми використовуємо спеціальну змінну з ім'ям?». Її значення – результат виведення останнього запущеного процесу. Останнім запущеним процесом було наше вікно Xdialog. Значить, змінна»?» містить останнє слово Xdialog перед його смертю. Якщо це слово було «255», то значить, клієнт так і не наважився ні на що — завершимо свою роботу.
Примітка: значення будь-якої змінної bash можна отримати, поставивши перед її ім'ям знак долара «$». Значення змінної "А" буде "$А", змінної "?" - відповідно «$?»
І наш код у uxmadplay, що виконує дану логічну вилку, виглядає так:
Спочатку звернемо увагу на вираз exit 1. Команда «exit» означає остаточний і безповоротний вихід із програми, звідки вона викликається, тобто. з uxmadplay. Іншими словами, exit - команда самогубства. А ось одиниця поруч - це і є те «останнє слово вмираючого», яке ми тільки-но використовували по відношенню до Xdialog. Отже, команда exit 1 означає Помру з останнім словом 1. Так вжезаведено, що останнє слово хочуть сказати, коли у житті щось не вийшло. Те саме справедливо і для програм. Коли вони вмирають, виконавши свою функцію, роблять це мовчки і щасливо. А якщо якась функція не виконана, вони надсилають слово. У випадку "Xdialog" цим лайливим передсмертним словом було "255" - три літери (точніше, цифри).
Нуль «0» буде сказано, якщо програма нічого не скаже — це очевидно.
Як бачимо, як умова ми використовується рядок - значення операції «не дорівнює» значення змінної $retval і «0». Рядок, який видає операція «не дорівнює», якщо виявиться, що «рівно», отже оператор не виконав свою функцію, і він вилаяється значенням «1». Якщо ж справді «не дорівнює», то оператор помре мовчки, і значення умови виявиться «0».
Звідси бачимо загальне правило: якщо рядок умови оператора if або нульової довжини, або дорівнює «0», отже умова вважати виконаним.
Реалізувати в bash-коді (з оператором if та Xdialog) приклади 1 та 2.