Dialog与Whiptail

Dialog

dialog是基于ncurses库的,在Linux的命令行下实现TUI界面的工具。

用法

dialog的语法为
dialog [选项] --title "标题" --控件类型 "描述" 高 宽 控件属性
高 宽0 0时,进行自动大小调整
高 宽1 1时,进行最大化
列表高度菜单高度0时,进行自动大小调整
在窗口中,选择OK或·Yesdialog返回0,选择CancelNodialog返回1,按下ESCdialog返回255
dialog的图形界面通过标准输出流打印,选择与输入结果通过标准错误流打印,要将结果保存到变量,要么使用2> 文件进行过渡,要么通过3>&1 1>&2 2>&3临时交换标准输出与标准错误,对于列表变量,还要通过($变量名)转换为数组变量

选项

选项有以下几项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--stderr                # 以标准错误方式输出
--stdout # 以标准输出方式输出
--output-separator "${IFS}" # 指定输出的分隔符,默认为换行(对列表来说是空格)
--clear # 进行清屏操作。在窗口显示结束后,清除窗口。这个选项只能单独使用
--shadow # 出现阴影效果,这是默认选项
--no-shadow # 禁止阴影出现在每个对话框的底部
--insecure # 使用星号来代表每个字符,用于密码
--no-cancel # 在输入框,菜单,和复选框中,不显示"Cancel"选项
--ok-label "内容" # 覆盖"OK"按钮的内容,换成其他内容
--cancel-label "内容" # 覆盖"Cancel"按钮的内容,换成其他内容
--backtitle "标题" # 指定背景标题字符串,显示在背景顶部
--begin Y X # 指定对话框的左上角锚点在屏幕的上的坐标
--timeout 秒 # 如果用户在指定的时间内没有给出相应动作,就按超时(返回错误代码)处理
--sleep 秒 # 静止指定时间
--default-item "标签" # 设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认

控件

类型 选项 含义
日历框 --calendar "描述" 高 宽 [日 月 年] 提供了一个日历,让用户选择日期,打印到错误输出
时间框 --timebox [--time-format 格式] "描述" 高 宽 提供一个窗口,选择小时,分钟,秒,打印到错误输出
文件选择框 --fselect "目录路径" 高 宽 提供一个路径,让用户选择文件,路径打印到错误输出
进度框 --gauge "描述" 高 宽 起始百分比 类似于pv命令,接受标准输入,按百分比显示输入进度
单选框 --radiolist "描述" 高 宽 菜单高度 "标签1" "内容1" on或off 让用户选择列表中的单个选项,打印选择的标签到错误输出
菜单框 --menu [--no-tags] [--no-items] "描述" 高 宽 菜单高度 "标签1" "内容1"... 让用户选择菜单中的单个选项,打印选择的标签到错误输出
复选框 --checklist [--no-tags] [--no-items] "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... 让用户选择列表中的多个选项,打印空格分隔的标签列表到错误输出
信息框 --infobox "描述" 高 宽 对话框立刻显示消息并继续执行,但并不清除屏幕
输入框 --inputbox "描述" 高 宽 ["初始输入内容"] 允许用户输入文本,将输入内容打印到错误输出
密码框 --passwordbox --insecure "描述" 高 宽 ["初始输入内容"] 类似于输入库,但是不在窗口中显示输入内容
消息框 --msgbox "描述" 高 宽 向用户显示一条消息,同时显示一个OK按钮,用户确认后才会继续操作
文本框 --textbox [--scrollbar] "文件路径" 高 宽 在带有滚动条的文本框中显示一个文件的内容
反文本框 --tailbox "文件路径" 高 宽 从下而上的在文本框中显示一个文件的内容
编辑框 --editbox "文件路径" 高 宽 在窗口中编辑一个文件
是/否框 --yesno [--defaultno] "描述" 高 宽 进行提问,用户可以选择yes或no,yes返回0,no返回1

Whiptail

whiptail是由红帽开发的,基于newt库的全新(1998年)TUI界面工具,相比于dialogwhiptail精简了部分选项,简化了用法,同时又保留了很大程度的兼容。目前大部分发行版制作的TUI工具都基于whiptail

用法

whiptail的语法为
whiptail [选项] --title "标题" --控件类型 "描述" 高 宽 控件属性
高 宽0 0时,进行自动大小调整
高 宽1 1时,进行最大化
列表高度菜单高度0时,进行自动大小调整
在窗口中,选择OK或·Yeswhiptail返回0,选择CancelNowhiptail返回1,按下ESCwhiptail返回255
whiptail的图形界面通过标准输出流打印,选择与输入结果通过标准错误流打印,要将结果保存到变量,要么使用2> 文件进行过渡,要么通过3>&1 1>&2 2>&3临时交换标准输出与标准错误,对于列表变量,还要通过($变量名)转换为数组变量
resize命令会打印出whiptailLINESCOLUMNS变量,它们决定着whiptail的窗口大小,可以通过eval "resize"命令获取这两个变量,并在之后用于设定

选项

选项有以下几项:

1
2
3
4
5
6
7
8
--seperate-output       # 对于列表,将分隔符从空格转换为换行符
--clear # 进行清屏操作。在窗口显示结束后,清除窗口。这个选项只能单独使用
--nocancel # 在输入框,菜单,和复选框中,不显示"Cancel"选项
--ok-button "内容" # 覆盖"OK"按钮的内容,换成其他内容
--cancel-button "内容" # 覆盖"Cancel"按钮的内容,换成其他内容
--backtitle "标题" # 指定背景标题字符串,显示在背景顶部
--topleft # 窗口从屏幕左上角开始定位,而不是屏幕中央
--default-item "标签" # 设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认

控件

类型 选项 含义
进度框 --gauge "描述" 高 宽 起始百分比 类似于pv命令,接受标准输入,按百分比显示输入进度
单选框 --radiolist "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... 让用户选择列表中的单个选项,打印选择的标签到错误输出
菜单框 --menu [--notags] [--noitems] "描述" 高 宽 菜单高度 "标签1" "内容1"... 让用户选择菜单中的单个选项,打印选择的标签到错误输出
复选框 --checklist [--notags] [--noitems] "描述" 高 宽 菜单高度 "标签1" "内容1" on或off... 让用户选择列表中的多个选项,打印空格分隔的标签列表到错误输出
信息框 --infobox "描述" 高 宽 对话框立刻显示消息并继续执行,但并不清除屏幕
输入框 --inputbox "描述" 高 宽 ["初始输入内容"] 允许用户输入文本,将输入内容打印到错误输出
密码框 --passwordbox "描述" 高 宽 ["初始输入内容"] 类似于输入库,但是不在窗口中显示输入内容
消息框 --msgbox "描述" 高 宽 向用户显示一条消息,同时显示一个OK按钮,用户确认后才会继续操作
文本框 --textbox [--scrolltext] "文件路径" 高 宽 在带有滚动条的文本框中显示一个文件的内容
是/否框 --yesno [--defaultno] [--yes-button "内容"] [--no-button "内容"] "描述" 高 宽 进行提问,用户可以选择yes或no,yes返回0,no返回1

实例

均以whiptail为例。

二选一

1
2
3
4
5
6
if (whiptail --title "" --yesno "Choose between Yes and No:" 0 0)
then
echo "You chose Yes."
else
echo "You chose No."
fi

获取输入

1
variable=$(whiptail --title "" --inputbox "Variable:" 0 0 3>&1 1>&2 2>&3)

获取密码

1
PASSWORD=$(whiptail --title "Password" --passwordbox "Enter your password:" 0 0 3>&1 1>&2 2>&3)

显示选择菜单

1
2
3
4
5
OPTION=$(whiptail --title "" --menu "Choose your option:" 0 0 0 \
"1" "I am option 1." \
"2" "I am option 2." \
"3" "I am option 3." \
"4" "I am option 4." 3>&1 1>&2 2>&3)

进行单选

1
2
3
4
5
OPTION=$(whiptail --title "" --radiolist "Choose your option:" 0 0 0 \
"1" "I am option 1." \
"2" "I am option 2." \
"3" "I am option 3." \
"4" "I am option 4." 3>&1 1>&2 2>&3)

进行多选

1
2
3
4
5
6
7
8
OPTIONS=$(whiptail --title "" --checklist \
"What is the Linux distro of your choice?" 0 0 0 \
"1" "I am option 1." on \
"2" "I am option 2." on \
"3" "I am option 3." off \
"4" "I am option 4." off 3>&1 1>&2 2>&3)

OPTIONS_ARRAY=($OPTIONS)

进度条

1
2
3
4
for i in $(seq 1 100); do
sleep 0.1
echo $i
done | whiptail --title "" --gauge "" 0 0 0