Bash Shell 脚本/Whiptail
Whiptail 是一个程序,允许 Shell 脚本向用户显示 对话框 以供信息目的,或以友好的方式从用户那里获取输入。Whiptail 默认包含在 Debian 中。
- 来自 Linux 词典:whiptail 是使用 newt 而不是 ncurses 的“dialog”替代品。
- 从它的自述文件中:whiptail 旨在与 dialog(1) 兼容,但功能更少:一些对话框没有实现,例如 tailbox、timebox、calendarbox 等。
尝试使用dialog替换whiptail如果你没有whiptail: alias whiptail='dialog'
请注意,还有其他与 dialog 兼容的程序,例如 xdialog(显示 X11 窗口)和 zenity(又名 gdialog,显示 Gtk 窗口)。阅读 dialog 的手册页应该会有所帮助。始终阅读手册页或 --help
以了解它们与 dialog 的不同之处。
Whiptail 中一种简单的对话框类型是信息框。这将向用户显示一个包含文本的对话框。
whiptail --title "Example Dialog" --infobox "This is an example of an info box." 8 78
在上面的示例中,--title的值显示在对话框的顶部。第一个参数为--infobox是对话框文本,它显示在标题下方。接下来的两个参数指定对话框的高度和宽度。宽度设置为 78,因为大多数终端至少有 80 列或更多。
存在一个错误,导致信息框在某些 Shell 上无法显示。如果是这种情况,您可以将终端模拟设置为其他类型,它将起作用。
TERM=ansi whiptail --title "Example Dialog" --infobox "This is an example of an info box" 8 78
消息框与信息框非常相似,不同之处在于它会等待用户按下“确定”按钮。用法与信息框类似
whiptail --title "Example Dialog" --msgbox "This is an example of a message box. You must hit OK to continue." 8 78
从用户那里获取输入的最简单方法是通过是/否框。这将显示一个带有两个按钮的对话框,分别标记为“是”和“否”。
# If you cannot understand this, read Bash_Shell_Scripting/Conditional_Expressions again.
if whiptail --title "Example Dialog" --yesno "This is an example of a yes/no box." 8 78; then
echo "User selected Yes, exit status was $?."
else
echo "User selected No, exit status was $?."
fi
从用户那里获取自由格式输入的一种方法是通过输入框。这将显示一个带有两个按钮的对话框,分别标记为“确定”和“取消”。
COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 39 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
# A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "User selected Ok and entered " $COLOR
else
echo "User selected Cancel."
fi
echo "(Exit status was $exitstatus)"
一个包含给定文件内容的文本框。如果文件名超过窗口长度,则添加 --scrolltext。
echo "Welcome to Bash $BASH_VERSION" > test_textbox
# filename height width
whiptail --textbox test_textbox 12 80
从用户那里获取隐藏密码的一种方法是通过密码框。这将显示一个带有两个按钮的对话框,分别标记为“确定”和“取消”。
PASSWORD=$(whiptail --passwordbox "please enter your secret password" 8 78 --title "password dialog" 3>&1 1>&2 2>&3)
# A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus == 0 ]; then
echo "User selected Ok and entered " $PASSWORD
else
echo "User selected Cancel."
fi
echo "(Exit status was $exitstatus)"
无论何时您想要向用户呈现选项列表,whiptail 都有几种对话框类型可供选择。
当您希望用户从列表中选择一个选项时,例如导航程序,应使用菜单。
whiptail --title "Menu example" --menu "Choose an option" 25 78 16 \
"<-- Back" "Return to the main menu." \
"Add User" "Add a user to the system." \
"Modify User" "Modify an existing user." \
"List Users" "List all users on the system." \
"Add Group" "Add a user group to the system." \
"Modify Group" "Modify a group and its list of members." \
"List Groups" "List all groups on the system."
给定给 --menu 的值是
- 描述菜单的文本("选择一个选项")
- 对话框的高度(25)
- 对话框的宽度(78)
- 菜单列表的高度(16)
其余值是格式为标记 项的菜单选项列表,其中标记是选项的名称,它会打印到stderr中,当选择时,并且项是菜单选项的描述。
如果您要呈现一个很长的菜单,并希望充分利用可用的屏幕,您可以通过以下方式计算最佳框大小。
eval `resize`
whiptail ... $LINES $COLUMNS $(( $LINES - 8 )) ...
在某些情况下,您需要向用户呈现不适合放置在菜单中的选项。
复选框允许用户从列表中选择一个或多个选项。
whiptail --title "Check list example" --checklist \
"Choose user's permissions" 20 78 4 \
"NET_OUTBOUND" "Allow connections to other hosts" ON \
"NET_INBOUND" "Allow connections from other hosts" OFF \
"LOCAL_MOUNT" "Allow mounting of local devices" OFF \
"REMOTE_MOUNT" "Allow mounting of remote devices" OFF
当用户确认他们的选择时,选择的列表将打印到stderr.
单选框是一个对话框,用户可以在其中从列表中选择一个选项。单选框和菜单的区别在于用户选择一个选项(在 whiptail 中使用空格键),然后通过按下“确定”确认该选择。
whiptail --title "Radio list example" --radiolist \
"Choose user's permissions" 20 78 4 \
"NET_OUTBOUND" "Allow connections to other hosts" ON \
"NET_INBOUND" "Allow connections from other hosts" OFF \
"LOCAL_MOUNT" "Allow mounting of local devices" OFF \
"REMOTE_MOUNT" "Allow mounting of remote devices" OFF
语法whiptail --gauge <文本> <高度> <宽度> [<百分比>]
也读取百分比从 stdin
#!/bin/bash
{
for ((i = 0 ; i <= 100 ; i+=5)); do
sleep 0.1
echo $i
done
} | whiptail --gauge "Please wait while we are sleeping..." 6 50 0