Основы программирования в Linux
Таблица 2.21
Тип диалогового окна Параметры --checklisttext height width list-height [tag text status] ...--infoboxtext height width--inputboxtext height width [initial string]--menutext height width menu-height [tag item ] ...--msgboxtext height width--radiolisttext height width list-height [tag text status] ...--textboxfilename height width--yesnotext height widthПомимо параметров диалоговые окна всех типов принимают ряд опций. Мы не будем перечислять все, а упомянем лишь две из них:
, позволяющую задать заголовок окна, и--title, применяемую по прямому назначению, т.е. для очистки экрана. Полный список опций см. на страницах интерактивного справочного руководства.-clearВыполните упражнения 2.21 и 2.22.
Упражнение 2.21. Применение утилитыdialogДавайте сразу перейдем к красивому сложному примеру. Если вы поймете его, все остальные покажутся легкими! В этом примере вы создадите диалоговое окно со списком флажков, с заголовком Check me (Поставь галочку) и пояснительной надписью Pick Numbers (Выбери номера). Окно с флажками будет высотой 15 строк и шириной 25 символов, и каждый флажок будет занимать 3 символа по высоте. И последнее, но не по степени важности, вы перечислите отображаемые элементы вместе с принятой по умолчанию установкой или сбросом (on/off) флажка.
dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three" "off"Полученный результат показан на рис. 2.4.
Как это работает
В этом примере параметр
указывает на то, что вы собираетесь создать диалоговое окно с флажками. Вы используете опцию--checklistдля задания заголовка "--title", следующий параметр — пояснительная надпись "Check me".Pick NumbersДалее вы переходите к указанию размеров диалогового окна. Оно будет высотой 15 строк и шириной 25 символов и 3 строки отводятся для меню. Это не самый удачный выбор размеров, но он позволит вам увидеть, как размещаются элементы.
Опции выглядят несколько мудрено, но вам следует запомнить только то, что у каждого элемента списка есть три значения:
□ номер в списке;
□ текст;
□ состояние.
Рис. 2.4
У первого элемента номер 1, отображается текст "one" (один) и выбрано состояние "off" (сброшен). Далее вы переходите ко второму элементу с номером 2, текстом "two" и состоянием "on" (установлен). Так продолжается до тех пор, пока вы не опишите все элементы списка.
Легко, не правда ли? Теперь попробуйте ввести несколько вариантов в командной строке и убедитесь, насколько эту утилиту легко применять. Для того чтобы включить этот пример в программу, вы должны иметь доступ к результатам пользовательского ввода. Это совсем просто: перенаправьте стандартный поток ошибок в текстовый ввод или проверьте переменную окружения
, которая, как вы помните, не что иное, как код завершения предыдущей команды.$?Упражнение 2.22. Более сложная программа, использующая утилитуdialogДавайте рассмотрим простую программу questions, которая принимает к сведению пользовательские ответы.
1. Начните с простого диалогового окна, сообщающего пользователю о происходящем. Вам не нужно получать результат или какой бы то ни было ввод пользователя, поэтому все просто и ясно:
#!/bin/sh# Задайте несколько вопросов и получите ответdialog --title "Questionnaire" --msgbox "Welcome to my simple survey" 9 182. Спросите пользователя с помощью простого диалогового окна с кнопками типа Yes/No, хочет ли он продолжать. Воспользуйтесь переменной окружения
для того, чтобы выяснить, выбрал пользователь ответ Yes (код завершения 0) или No. Если он не хочет двигаться дальше, используйте простое информационное окно, не требующее никакого пользовательского ввода для своего завершения.$?dialog --title "Confirm" --yesno "Are you willing to take part?" 9 18if [ $? != 0 ]; thendialog --infobox "Thank you anyway" 5 20 sleep 2dialog --clear exit 0fi3. Спросите у пользователя его имя с помощью диалогового окна ввода. Перенаправьте стандартный поток ошибок во временный файл _1.txt, который затем вы сможете обработать в переменной
.QNAMEdialog --title "Questionnaire" --inputbox "Please enter your name" 9 30 2>_1.txtQ_NAME=$(cat _1.txt)4. Здесь у вас появляется меню из четырех пунктов. И снова вы перенаправляете стандартный поток ошибок и загружаете его в переменную.
dialog --menu "$Q_NAME, what music do you like best?" 15 30 4 1 "Classical" 2 "Jazz" 3 "Country" 4 "Other" 2>_1.txtQ_MUSIC=$(cat _1.txt)5. Номер, выбранный пользователем, будет запоминаться во временном файле _1.txt, который перехватывается переменной
, поэтому вы сможете проверить результат.Q_MUSICif [ "$Q_MUSIC" = "1" ]; thendialog --title "Likes Classical" --msgbox "Good choice!" 12 25elsedialog --title "Doesn't like Classical" --msgbox "Shame" 12 25
