Dialog
Установка
- apt-get install dialog
- brew install dialog
- yum install dialog
Описание
dialog это утилита для построения консольных интерфейсов. Dialog входит в состав большинства дистрибутивов GNU/Linux. Если вы хотите собрать её из исходников, то архив можно найти на http://hightek.org/dialog/.
Эта программа являются свободными и работают на большом количестве платформ *nix. Большинство приведённых примеров в данном руководстве являются адаптацией примеров, поставляемых с исходными кодами программ.
Да / Нет
Вот первый скрипт, работу которого я проверил. Он просто выводит диалог с кнопками "Да" и "Нет".
#!/bin/bashDIALOG=${DIALOG=dialog} $DIALOG--title" Мой первый диалог"--clear \ --yesno"Привет! Перед вами пример программы,\nиспользующей (X)dialog"1040 case$?in0)echo"Выбрано 'Да'.";;1)echo"Выбрано 'Нет'.";;255)echo"Нажата клавиша ESC.";;esac
Применяемые опции:
- --title задаёт заголовок диалога
- --clear очищает экран перед отображением диалога
- --yesno задаёт тип диалога и текст для отображения.
Ввод данных
Следующая программа ожидает ввода строку и затем отображает её на экране.
#!/bin/shDIALOG=${DIALOG=dialog}tempfile=`tempfile2>/dev/null`||tempfile=/tmp/test$$trap"rm -f $tempfile"012515 $DIALOG--title"Ввод данных"--clear \ --inputbox"Привет! Перед вами пример ввода даных\nВведите своё имя:"16512>$tempfile retval=$? case$retvalin0)echo"Вы ввели `cat $tempfile`";;1)echo"Отказ от ввода.";;255)iftest-s$tempfile ; thencat$tempfileelseecho"Нажата клавиша ESC."fi;;esac
Организация меню
Следующая программа позволяет вам организовать список с возможностью выбора одного из элементов:
#!/bin/shDIALOG=${DIALOG=dialog}tempfile=`mktemp2>/dev/null`||tempfile=/tmp/test$$trap"rm -f $tempfile"012515 $DIALOG--clear--title"Мои любимые исполнители" \ --menu"Все любят песни хинди, поэтому выбирайте:"20514 \ "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$retvalin0)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=-- &&breakexecdate +s"No dialog program found"done; declare-Ao="$1"; shift $DIA--backtitle"${o[backtitle]}"--title"${o[title]}" \ --menu"${o[text]}"000$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"15405\ 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» 12353 $(echo{hello,habra,habr}" '' 0"
Списки зависимых кнопок (radiolist) и флажков (checklist)
Формирование таких списков аналогично организации меню, описанного в предыдущем разделе.
#! /bin/shDIALOG=${DIALOG=dialog}tempfile=`mktemp2>/dev/null`||tempfile=/tmp/test$$trap"rm -f $tempfile"012515 $DIALOG--backtitle"Не стесняйтесь, выберите любимого певца" \ --title"Выбор исполнителя"--clear \ --radiolist"Мой любимый певец, это... "20615 \ "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$retvalin0)echo"Ого! Кто бы мог подумать, но выбор пал на '$choice'";;1)echo"Отказ от ввода.";;255)echo"Нажата клавиша ESC.";;esac
Для того, чтобы использовать список флажков, вместо радиокнопок, замените в скрипте опцию --radiolist на --checklist.
Создание индикатора (прогрессбар)
Такой элемент позволяет визуализировать процесс выполнения вашего скрипта:
#!/bin/shDIALOG=${DIALOG=dialog} COUNT=10(whiletest$COUNT!= 110doecho$COUNTecho"XXX"echo"Новое сообщение ($COUNTпроцентов)"echo"Строка 2"echo"XXX"COUNT=`expr$COUNT + 10`sleep1done)|$DIALOG--title"Индикатор"--gauge"А вот пример простейшего индикатора"20700
#!/bin/sh (c=10while[$c-ne110]doecho$c((c+=10))sleep1done)|dialog--title" Тест диалога прогресса "--gauge"Please wait ...."10600 clear
Выбор файла
Вот пример простейшего диалога для выбора файла:
#!/bin/shDIALOG=${DIALOG=dialog} FILE=`$DIALOG--stdout--title"Выберите файл"--fselect$HOME/1060` case$?in0)echo"Выбран \"$FILE\"";;1)echo"Отказ от ввода.";;255)echo"Нажата клавиша ESC.";;esac
Календарь и настройка часов
Информация о годе, месяце и дне выводится на отдельных панелях. Если значение дня,месяца или года не указано, либо оно отрицательное, то используются системная дата. (Работает только в dialog. Указать в качестве начального значения , например, 1000-й год не получится -- dialog воспринимает это как неверное значение и указывает текущую дату. Для изменения значений можно использовать стрелки управления курсором, либо воспользоваться горячими клавишами, используемыми в vi при навигации по тексту: h, j, k и l. Если год устанавливается равным 0, то по умолчанию используется значение текущего года. Результат выводится в формате день/месяц/год
#!/bin/shDIALOG=${DIALOG=dialog} USERDATE=`$DIALOG--stdout--title"Календарь"--calendar"Выберите дату..." 00 771981` case$?in0)echo"Выбрано: $USERDATE.";;1)echo"Отказ от ввода.";;255)echo"Нажата клавиша ESC.";;esac
Настройка часов
Этот диалог позволяет вам выбирать время:
#!/bin/sh DIALOG=${DIALOG=Xdialog}USERTIME=`$DIALOG--stdout--title"Настройка часов" \ --timebox"Укажите,пожалуйста, время..."00123456` case$?in0)echo"Указано время: $USERTIME.";;1)echo"Отказ от ввода.";;255)echo"Нажата клавиша ESC.";;esac
Подсказки
Ваш скрипт сможет самостоятельно делать выбор между dialog и Xdialog, если в его начале дописать следующую конструкцию:
if[-z$DISPLAY]thenDIALOG=dialogelseDIALOG=Xdialog fi