Whiptail - псевдографические диалоговые окна в терминале
10.03.2022
Whiptail доступен в Linux и *BSD системах. Установка осуществляется из пакетного менеджера.
Сообщение
Значения 10 60
- обозначают высоту и ширину.
whiptail --title "Важное сообщение!" \
--ok-button "продолжить" \
--msgbox "Здесь должна быть важная информация." 10 60
Также можно отобразить содержимое файла. Например текст свободной лицензии GPL 3:
whiptail --title "Лицензия GPL 3" \
--ok-button "принять" --scrolltext \
--textbox /usr/share/common-licenses/GPL-3 20 60
Диалог да/нет
В данном случаи ответ возвращается с помощью кода завершения программы. Да - 0. Нет - 1.
if (whiptail --title "Да или нет?" --yesno "Да или нет?" 10 60) then
echo "Вы выбрали ДА"
else
echo "Вы выбрали НЕТ"
fi
Так же можно переназначить описание кнопок и убрать заголовок:
if (whiptail --yes-button "красная" --no-button "синея" \
--yesno "Примешь синюю таблетку и сказке конец.\nПримешь красную таблетку - войдёшь в страну чудес." 10 60) then
echo "Красная таблетка"
else
echo "Синея таблетка"
fi
Ввод текста
3>&1 1>&2 2>&3
- эта конструкция позволяет вернуть скрипту данные, введённые пользователем.
Работает это так:
- Создаётся файловый дескриптор 3, указывающий на stdout
- stdout перенаправляется в stderr
- stderr перенаправляется на 3 дескриптор, на который указывает stdout
NAME=$(whiptail --title "Ваше имя" \
--ok-button "продолжить" --cancel-button "отмена" \
--inputbox "Введите ваше ФИО:" 10 60 "Иванов Иван Иванович" 3>&1 1>&2 2>&3)
if [ $? = 0 ]; then
echo "Ваше имя: $NAME"
else
echo "Отмена"
fi
Ввод пароля
PASSWORD=$(whiptail --title "Новый пароль" \
--ok-button "продолжить" --cancel-button "отмена" \
--passwordbox "Придумайте новый пароль:" 10 60 "root" 3>&1 1>&2 2>&3)
if [ $? = 0 ]; then
echo "Пароль: $PASSWORD"
else
echo "Отмена"
fi
Меню
15 60 5
- цифра 5, обозначает количество пунктов меню, помещающихся на экране.
То есть 6 пункт будет уже скрыт.
Кстати, номера можно скрыть с помощью флага --notags
.
OPTION=$(whiptail --title "Меню" --menu "Выберите блюдо:" 15 60 5 \
--ok-button "продолжить" --cancel-button "отмена" \
"1" "Котлетки с макарошками" \
"2" "Котлетки с пюрешкой" \
"3" "Рис с рыбой" \
"4" "Тушёнка" \
"5" "Суп гороховый" \
"6" "Овощи с мясом" \
3>&1 1>&2 2>&3)
if [ $? = 0 ]; then
echo "Пользователь выбрал пункт номер $OPTION"
else
echo "Отмена"
fi
Выбор одного значения
ON
/OFF
- отвечают за выбор пунктов по умолчанию.
OPTION=$(whiptail --title "Выбирай!" \
--ok-button "продолжить" --cancel-button "отмена" \
--radiolist "Кто тут самый главный анархист?" 15 60 4 \
"1" "Инструкция по выживания" OFF \
"2" "Гражданская Оборона" ON \
"3" "Великие Октябри" OFF \
3>&1 1>&2 2>&3)
if [ $? = 0 ]; then
echo "Пользователь выбрал пункт номер $OPTION"
else
echo "Отмена"
fi
Выбор нескольких значений
OPTION=$(whiptail --title "Лучшие игры" --checklist \
--ok-button "продолжить" --cancel-button "отмена" \
"Игры всех времён и народов:" 15 60 8 \
"1" "Super Tux Kart" OFF \
"2" "Counter-Strike 1.6" OFF \
"3" "Quake 3 Arena" ON \
"4" "Half-Life 2" ON \
3>&1 1>&2 2>&3)
if [ $? = 0 ]; then
echo "Выбранные пункты: $OPTION"
else
echo "Отмена"
fi
Прогресс бар
6 60 0
- 0 обозначает количество процентов, с которого начинается отсчёт.
{
sleep 1
echo "20"
sleep 1
echo "40"
sleep 1
echo "60"
sleep 1
echo "80"
sleep 1
echo "100"
} | whiptail --gauge "Пожалуйста подождите..." 6 60 0
Ссылки
man whiptail
- Use Whiptail - RedHat.com
- WhipTail Interactive Shell Scripting Dialog - ProgrammerAll.com