Dialog
Установка
- apt-get install dialog
- brew install dialog
- yum install dialog
Описание
dialog это утилита для построения консольных интерфейсов. Dialog входит в состав большинства дистрибутивов GNU/Linux. Если вы хотите собрать её из исходников, то архив можно найти на http://hightek.org/dialog/.
Эта программа являются свободными и работают на большом количестве платформ *nix. Большинство приведённых примеров в данном руководстве являются адаптацией примеров, поставляемых с исходными кодами программ.
Да / Нет
Вот первый скрипт, работу которого я проверил. Он просто выводит диалог с кнопками "Да" и "Нет".
#!/bin/bash DIALOG=${DIALOG=dialog} $DIALOG --title " Мой первый диалог" --clear \ --yesno "Привет! Перед вами пример программы,\nиспользующей (X)dialog" 10 40 case $? in 0) echo "Выбрано 'Да'.";; 1) echo "Выбрано 'Нет'.";; 255) echo "Нажата клавиша ESC.";; esac
Применяемые опции:
- --title задаёт заголовок диалога
- --clear очищает экран перед отображением диалога
- --yesno задаёт тип диалога и текст для отображения.
Ввод данных
Следующая программа ожидает ввода строку и затем отображает её на экране.
#!/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
Организация меню
Следующая программа позволяет вам организовать список с возможностью выбора одного из элементов:
#!/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
#!/usr/bin/env bash t(){ type "$1"&>/dev/null;} function Menu.Show { local DIA DIA_ESC; while :; do t whiptail && DIA=whiptail && break t dialog && DIA=dialog && DIA_ESC=-- && break exec date +s"No dialog program found" done; declare -A o="$1"; shift $DIA --backtitle "${o[backtitle]}" --title "${o[title]}" \ --menu "${o[text]}" 0 0 0 $DIA_ESC "$@"; } Menu.Show '([backtitle]="Backtitle" [title]="Title" [question]="Please choose:")' \ \ "Option A" "Stuff...." \ "Option B" "Stuff...." \ "Option C" "Stuff...."
$ dialog --checklist "Preferred Linux distros" 15 40 5\ debian "Venerable Debian" off \ ubuntu "Popular Ubuntu" on \ fedora "Hackish Fedora" off \ centos "Stable Centos" off \ mint "Rising Star Mint" off 2>distrochoice
$ dialog --title Habr --checklist «Simple checkbox menu» 12 35 3 $(echo {hello,habra,habr}" '' 0"
Списки зависимых кнопок (radiolist) и флажков (checklist)
Формирование таких списков аналогично организации меню, описанного в предыдущем разделе.
#! /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
Для того, чтобы использовать список флажков, вместо радиокнопок, замените в скрипте опцию --radiolist на --checklist.
Создание индикатора (прогрессбар)
Такой элемент позволяет визуализировать процесс выполнения вашего скрипта:
#!/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
#!/bin/sh ( c=10 while [ $c -ne 110 ] do echo $c ((c+=10)) sleep 1 done ) | dialog --title " Тест диалога прогресса " --gauge "Please wait ...." 10 60 0 clear
Выбор файла
Вот пример простейшего диалога для выбора файла:
#!/bin/sh DIALOG=${DIALOG=dialog} FILE=`$DIALOG --stdout --title "Выберите файл" --fselect $HOME/ 10 60` case $? in 0) echo "Выбран \"$FILE\"";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac
Календарь и настройка часов
Информация о годе, месяце и дне выводится на отдельных панелях. Если значение дня,месяца или года не указано, либо оно отрицательное, то используются системная дата. (Работает только в dialog. Указать в качестве начального значения , например, 1000-й год не получится -- dialog воспринимает это как неверное значение и указывает текущую дату. Для изменения значений можно использовать стрелки управления курсором, либо воспользоваться горячими клавишами, используемыми в vi при навигации по тексту: h, j, k и l. Если год устанавливается равным 0, то по умолчанию используется значение текущего года. Результат выводится в формате день/месяц/год
#!/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
Настройка часов
Этот диалог позволяет вам выбирать время:
#!/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
Подсказки
Ваш скрипт сможет самостоятельно делать выбор между dialog и Xdialog, если в его начале дописать следующую конструкцию:
if [ -z $DISPLAY ] then DIALOG=dialog else DIALOG=Xdialog fi