Условный оператор if

Условные операторы if (если), case (в случае), while (пока) — основное средство для создания более или менее разумных скриптов, которые выбирают один из нескольких вариантов действий в зависимости от условий. Такие операторы присутствуют почти во всех распространенных языках программирования. Bash — не исключение.

Программа uxmadplay задумывалась, в частности, для того, чтобы дать пользователю возможность выбирать различные способы проигрывания одного и того же файла или плейлиста, например: проиграть его однократно или повторять до бесконечности, выводить информацию о файле на экран или не выводить, и т.д. Поэтому использование условных операторов в uxmadplay было неизбежно.

Любой условный оператор в любом языке программирования содержит два аргумента: условие и команду. Условие - это значение. Оно может быть числом, символом или строкой. Команда — это любая команда или оператор bash или список команд.

Условные операторы крайне важны, так как они позволяют устроить ветвление в теле программы, например, так:


                          условие   выполнено  → команда2 → команда3
                         ↑
команда1 → если (условие)
                         ↓
                          условие не выполнено → команда4 → команда5

Как видно, программа, включающая условный оператор настолько совершеннее простого списка команд, насколько вилка совершеннее гвоздя.

Оператор if — двойная вилка — простейший из всех условных операторов.

В общем случае, запись оператора if выглядит так:

if [ строка_условия ]
then
    команда
end

Пример 1

В случае uxmadplay мне надо сделать так, чтобы пользователь выбрал, выводить ли подробную иформацию о поигрываемом файле в окно терминала с madplay или нет. Если он выбрал «Выводить подробную информацию», то запускаем madplay с аргументом »-v», что, собственно, и сделает вывод madplay подробным. Вилка условного оператора выглядит так:

(Вопрос: "Подробная информация?" ⇒ Ответ ) →


                              "да"-(Аргумент="-v")
                              ↑                  ↓  
→ (Аргумент="") → если(Ответ?)———————————————————→ (madplay Аргумент "ИмяФайла")

Пример 2

В случае uxmadplay, чтобы устроить проигрывание по выбору, мне достаточно использовать только один условный оператор. Дело в том, что бесконечное проигрывание плейлиста — одна из функций madplay, стоит только ее запустить с аргументом -r:

madplay -r "ИмяФайла"

Значит, в качестве аргумента можно передать »-r», если пользователь выбрал повтор или пустую строку (»»), если пользователь его не выбрал.

(Вопрос: "Повторно играть список воспроизведения?" ⇒ Ответ ) →

                              "да"-(Аргумент="-р")
                              ↑                  ↓
→ (Аргумент="") → если(Ответ?)———————————————————→ (madplay Аргумент "ИмяФайла")

Пример 3

Преамбула

Чтобы задать вопрос пользователю, я решил использовать команду, которая генерирует на экране окно Xdialog. Данная команда может генерировать несколько типов окон. В uxmadplay мне нужно было окно типа «checklist» — по-русски «список для выбора». Для этого надо просто запустить Xdialog с опцией --checklist, за которой выдадим список для выбора, каждый элемент которого имеет вид:

«Выбор» «Название опции для выбора» «Исxодновыбрано»

Xdialog --title " Выберите файлы " \
        --checklist "В открывшиееся окно, перетащите файлы." 29 55 0 \
        "-r" "Повторно играть список воспроизведения" "on" > /tmp/buildlistbox.uxmadplay.tmp

В качестве названия опции мы записываем любую строку — то, что пользователь увидит на экране.

Строка «Исxодновыбрано» имеет значение либо «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, выполняющий данную логическую вилку, выглядит так:

retval=$?
if [ "$retval" != "0" ]
then
    exit 1
fi

Сначала обратим внимание на выражение «exit 1». Команда «exit» означает окончательный и бесповоротный выход из той программы, откуда она вызывается, т.е. из uxmadplay. Иными словами, «exit» - команда самоубийства. А вот единичка рядом - это и есть то «последнее слово умирающего», которое мы только что использовали по отношению к Xdialog. Итак, команда «exit 1» означает «Умру с последним словом — 1». Так уж заведено, что последнее слово хотят сказать, когда в жизни что-то не получилось. То же самое справедливо и для программ. Когда они умирают, исполнив свою функцию, то делают это молча и счастливо. А если какая-то функция не исполнена, они посылают слово. В случае «Xdialog» этим ругательным предсмертным словом было «255» — три буквы (точнее, цифры).

Ноль «0» будет сказан, если программа ничего не скажет — это очевидно.

Как мы видим, в качестве условия у нас используется строка - значение операции «не равно» значения переменной $retval и «0». Строка, которую выдает операция «не равно», если окажется, что «равно», значит оператор не выполнил свою функцию, и он выругается значением «1». Если же действительно «не равно», то оператор умрет молча, и значение условия окажется «0».

Отсюда мы видим общее правило: если строка условия в операторе if либо нулевой длины, либо равна «0», значит условие считать выполненным.

Задание

Реализовать в bash-коде (с оператором if и Xdialog) примеры 1 и 2.

Цена задания — 20 баллов.

 
programming/workshop1b.txt · Последние изменения: 01.03.2016 в 18:18 (внешнее изменение)
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki