При установки многих приложений или скриптов в Bash, можно увидеть диалоговые окна, которые позволяют выполнить действия или настройки, так же позволяющие вывести различную информацию. Это могут быть как простые окна, с выводом текста, так и диалог подтверждения действий, с вариантами выбора да/нет, диалоги ввода пароля, меню выбора. Использование диалоговых окон позволяет сделать процесс установки или настройки боле интерактивным и понятным пользователю, делая процесс интуитивно понятным.
Утилита whiptail, входящая во все современные дистрибутивы Linux, позволяет обеспечить создание различных диалоговых окон в Bash скриптах.
Диалоговое окно с сообщением
Диалог, позволяющий вывести произвольный текст, с кнопкой подтверждения. Приостанавливает работу скрипта, пока пользователь нажмет ОК.
1 | whiptail --title "<message title>" --msgbox "<text>" <height> <width> |
Примеры:
1 2 | #!/bin/bash whiptail --title "Message Box" --msgbox "Create a message box with whiptail. Choose Ok to continue." 10 60 |
1 2 3 4 5 | #!/bin/bash whiptail --title "Message Box" --msgbox "Lorem ipsum dolor sit amet, \ consectetur adipiscing elit. Nulla venenatis ornare arcu, eu dapibus augue. \ Nulla accumsan tellus ac facilisis ultricies. Nulla feugiat gravida dui at dignissim... \ \nChoose Ok to continue." 10 70 |
Диалоговое окно подтверждения (да/нет)
Выводит диалог подтверждения с кнопками yes и no, ожидая подтверждение действий от пользователя. К примеру что пользователь согласен продолжить установку или подтвердить параметры.
1 | whiptail --title "<dialog title>" --yesno "<text>" <height> <width> |
Пример:
1 2 3 4 5 | if (whiptail --title "Test Yes/No Box" --yesno "Are you sure?" 10 60) then echo "You chose Yes. Status $?." else echo "You chose No. Status $?." fi |
Опционально, можно изменить текст кнопок Yes и No, используя опции "--yes-button" и "--no-button"
1 2 3 4 5 | if (whiptail --title "Test Yes/No Box" --yesno "Are you sure?" --yes-button="Да, уверен" --no-button="Совсем не уверен" 10 60) then echo "You chose Yes. Status $?." else echo "You chose No. Status $?." fi |
Диалоговое окно ввода текста
Если необходимо что бы пользователь ввел какую либо информацию, к примеру сетевой адрес, имя пользователя или любую другую текстовую информацию, можно использовать соответствующий диалог.
1 | whiptail --title "<input title>" --inputbox "<text>" <height> <width> <default-text> |
Пример:
1 2 3 4 5 6 7 8 9 | #!/bin/bash NAME=$(whiptail --title "Input Box Form" --inputbox "What is your name?" 10 60 Termit 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus = 0 ]; then echo "Your name is:" $NAME else echo "You chose Cancel." fi |
Диалоговое окно ввода пароля
Данный тип диалога позволяет скрывать вводимые символы.
1 | whiptail --title "<password title>" --passwordbox "<text>" <height> <width> |
Пример:
1 2 3 4 5 6 7 8 9 | #!/bin/bash PASSWORD=$(whiptail --title "Password Dialog" --passwordbox "Enter your password." 10 60 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus = 0 ]; then echo "Your password is:" $PASSWORD else echo "You chose Cancel." fi |
Диалоговое окно с меню
Когда необходимо что бы пользователь выбрал из заранее предложенного списка, создается диалоговое окно menu
1 | whiptail --title "<menu title>" --menu "<text>" <height> <width> <menu height> [ <tag> <item> ] |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash OPTION=$(whiptail --title "Menu Dialog" --menu "Choose text" 15 60 4 \ "1" "Lorem ipsum dolor sit amet" \ "2" "Consectetur adipiscing elit" \ "3" "Nulla venenatis ornare arcu" \ "4" "Nulla accumsan tellus ac facilisis ultricies" 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus = 0 ]; then echo "Your chosen option:" $OPTION else echo "You chose Cancel." fi |
Диалоговое окно переключения (Radiolist)
Диалог по своему поведению очень похож на меню, но это диалог выбора и можно указать опцию выбранную по умолчанию.
1 | whiptail --title "<radiolist title>" --radiolist "<text>" <height> <width> <list height> [ <tag> <item> <status> ] |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash OPTION=$(whiptail --title "Radiolist Dialog" --radiolist \ "Chose text" 15 60 4 \ "1" "Lorem ipsum dolor sit amet" OFF \ "2" "Consectetur adipiscing elit" ON \ "3" "Nulla venenatis ornare arcu" OFF \ "4" "Nulla accumsan tellus ac facilisis ultricies" OFF \ 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus = 0 ]; then echo "Your chosen option:" $OPTION else echo "You chose Cancel." fi |
Диалоговое окно выбора (Checklist)
Когда необходимо дать пользователю выбрать несколько опций, применяется диалоговое окно checklist. Так же, как и предыдущий диалог, позволяет выбрать опции по умолчанию.
1 | whiptail --title "<checklist title>" --checklist "<text>" <height> <width> <list height> [ <tag> <item> <status> ] |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash OPTION=$(whiptail --title "Checklist Dialog" --checklist \ "Chose text" 15 60 4 \ "1" "Lorem ipsum dolor sit amet" OFF \ "2" "Consectetur adipiscing elit" ON \ "3" "Nulla venenatis ornare arcu" OFF \ "4" "Nulla accumsan tellus ac facilisis ultricies" OFF \ 3>&1 1>&2 2>&3) exitstatus=$? if [ $exitstatus = 0 ]; then echo "Your chosen option:" $OPTION else echo "You chose Cancel." fi |
Диалоговое окно с прогрессом (Progress Bar)
Диалог, позволяющий показать прогресс. К примеру прогресс выполнения задачи, отображая процент выполнения от 0 до 100. Считывает значения из вывода, и отображает в виде прогресса.
1 | whiptail --gauge "<text>" <height> <width> <inital percent> |
Пример:
1 2 3 4 5 6 7 | #!/bin/bash { for ((i = 0 ; i <= 100 ; i+=1)); do sleep 1 echo $i done } | whiptail --gauge "Please wait..." 6 60 0 |