Показать страницуИстория страницыСсылки сюдаCopy this pageExport to MarkdownODT преобразованиеНаверх Вы загрузили старую версию документа! Сохранив её, вы создадите новую текущую версию с этим содержимым. Медиафайлы{{tag>bash system shell}} ====== Dialog ====== {{http://hightek.org/sites/default/files/resize/menubox_0-600x376.jpg}} http://hightek.org/projects/dialog/screenshots ===== Установка ===== * apt-get install dialog * brew install dialog * yum install dialog ===== Описание ===== dialog это утилита для построения консольных интерфейсов. Dialog входит в состав большинства дистрибутивов GNU/Linux. Если вы хотите собрать её из исходников, то архив можно найти на http://hightek.org/dialog/. Эта программа являются свободными и работают на большом количестве платформ *nix. Большинство приведённых примеров в данном руководстве являются адаптацией примеров, поставляемых с исходными кодами программ. ===== Да / Нет ===== Вот первый скрипт, работу которого я проверил. Он просто выводит диалог с кнопками "Да" и "Нет". <code bash> #!/bin/bash DIALOG=${DIALOG=dialog} $DIALOG --title " Мой первый диалог" --clear \ --yesno "Привет! Перед вами пример программы,\nиспользующей (X)dialog" 10 40 case $? in 0) echo "Выбрано 'Да'.";; 1) echo "Выбрано 'Нет'.";; 255) echo "Нажата клавиша ESC.";; esac </code> Применяемые опции: * --title задаёт заголовок диалога * --clear очищает экран перед отображением диалога * --yesno задаёт тип диалога и текст для отображения. ===== Ввод данных ===== Следующая программа ожидает ввода строку и затем отображает её на экране. <code bash> #!/bin/sh DIALOG=${DIALOG=dialog} tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 $DIALOG --title "Ввод данных" --clear \ --inputbox "Привет! Перед вами пример ввода даных\nВведите своё имя:" 16 51 2> $tempfile retval=$? case $retval in 0) echo "Вы ввели `cat $tempfile`" ;; 1) echo "Отказ от ввода.";; 255) if test -s $tempfile ; then cat $tempfile else echo "Нажата клавиша ESC." fi ;; esac </code> ===== Организация меню ===== Следующая программа позволяет вам организовать список с возможностью выбора одного из элементов: <code bash> #!/bin/sh DIALOG=${DIALOG=dialog} tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 $DIALOG --clear --title "Мои любимые исполнители" \ --menu "Все любят песни хинди, поэтому выбирайте:" 20 51 4 \ "Rafi" "Mohammed Rafi" \ "Mukesh" "Mukesh" \ "Kishore" "Kishore Kumar" \ "Saigal" "K L Saigal" \ "Lata" "Lata Mangeshkar" \ "Yesudas" "K J Yesudas" 2> $tempfile retval=$? choice=`cat $tempfile` case $retval in 0) echo "Да вы эстет! '$choice' -- это лучшее, что вы слышали в своей жизни!";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac </code> ===== Списки зависимых кнопок (radiolist) и флажков (checklist) ===== Формирование таких списков аналогично организации меню, описанного в предыдущем разделе. <code bash> #! /bin/sh DIALOG=${DIALOG=dialog} tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 $DIALOG --backtitle "Не стесняйтесь, выберите любимого певца" \ --title "Выбор исполнителя" --clear \ --radiolist "Мой любимый певец, это... " 20 61 5 \ "Rafi" "Mohammed Rafi" off \ "Lata" "Lata Mangeshkar" ON \ "Hemant" "Hemant Kumar" off \ "Dey" "MannaDey" off \ "Kishore" "Kishore Kumar" off \ "Yesudas" "K. J. Yesudas" off 2> $tempfile retval=$? choice=`cat $tempfile` case $retval in 0) echo "Ого! Кто бы мог подумать, но выбор пал на '$choice'";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac </code> Для того, чтобы использовать список флажков, вместо радиокнопок, замените в скрипте опцию --radiolist на --checklist. ===== Создание индикатора (прогрессбар) ===== Такой элемент позволяет визуализировать процесс выполнения вашего скрипта: <code bash> #!/bin/sh DIALOG=${DIALOG=dialog} COUNT=10 ( while test $COUNT != 110 do echo $COUNT echo "XXX" echo "Новое сообщение ($COUNT процентов)" echo "Строка 2" echo "XXX" COUNT=`expr $COUNT + 10` sleep 1 done ) | $DIALOG --title "Индикатор" --gauge "А вот пример простейшего индикатора" 20 70 0 </code> ===== Выбор файла ===== Вот пример простейшего диалога для выбора файла: <code bash> #!/bin/sh DIALOG=${DIALOG=dialog} FILE=`$DIALOG --stdout --title "Выберите файл" --fselect $HOME/ 10 60` case $? in 0) echo "Выбран \"$FILE\"";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac </code> ===== Календарь и настройка часов ===== Информация о годе, месяце и дне выводится на отдельных панелях. Если значение дня,месяца или года не указано, либо оно отрицательное, то используются системная дата. (Работает только в dialog. Указать в качестве начального значения , например, 1000-й год не получится -- dialog воспринимает это как неверное значение и указывает текущую дату. Для изменения значений можно использовать стрелки управления курсором, либо воспользоваться горячими клавишами, используемыми в vi при навигации по тексту: h, j, k и l. Если год устанавливается равным 0, то по умолчанию используется значение текущего года. Результат выводится в формате день/месяц/год <code bash> #!/bin/sh DIALOG=${DIALOG=dialog} USERDATE=`$DIALOG --stdout --title "Календарь" --calendar "Выберите дату..." 00 7 7 1981` case $? in 0) echo "Выбрано: $USERDATE.";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac </code> ===== Настройка часов ===== Этот диалог позволяет вам выбирать время: <code bash> #!/bin/sh DIALOG=${DIALOG=Xdialog} USERTIME=`$DIALOG --stdout --title "Настройка часов" \ --timebox "Укажите,пожалуйста, время..." 0 0 12 34 56` case $? in 0) echo "Указано время: $USERTIME.";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac </code> ===== Подсказки ===== Ваш скрипт сможет самостоятельно делать выбор между dialog и Xdialog, если в его начале дописать следующую конструкцию: <code bash> if [ -z $DISPLAY ] then DIALOG=dialog else DIALOG=Xdialog fi </code>СохранитьПросмотрРазличияОтменить Сводка изменений Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии: CC0 1.0 Universal