跳转到内容

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 --msgbox

消息框

[编辑 | 编辑源代码]

消息框与信息框非常相似,不同之处在于它会等待用户按下“确定”按钮。用法与信息框类似

whiptail --title "Example Dialog" --msgbox "This is an example of a message box. You must hit OK to continue." 8 78
whiptail --yesno

是/否框

[编辑 | 编辑源代码]

从用户那里获取输入的最简单方法是通过是/否框。这将显示一个带有两个按钮的对话框,分别标记为“是”和“否”。

# 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
whiptail --inputbox

输入框

[编辑 | 编辑源代码]

从用户那里获取自由格式输入的一种方法是通过输入框。这将显示一个带有两个按钮的对话框,分别标记为“确定”和“取消”。

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)"
whiptail --textbox

文本框

[编辑 | 编辑源代码]

一个包含给定文件内容的文本框。如果文件名超过窗口长度,则添加 --scrolltext。

echo "Welcome to Bash $BASH_VERSION" > test_textbox
#                  filename height width
whiptail --textbox test_textbox 12 80
whiptail --passwordbox

密码框

[编辑 | 编辑源代码]

从用户那里获取隐藏密码的一种方法是通过密码框。这将显示一个带有两个按钮的对话框,分别标记为“确定”和“取消”。

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 --menu 列表太高

无论何时您想要向用户呈现选项列表,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."
whiptail --menu 列表适合

给定给 --menu 的值是

  • 描述菜单的文本("选择一个选项")
  • 对话框的高度(25)
  • 对话框的宽度(78)
  • 菜单列表的高度(16)

其余值是格式为标记 项的菜单选项列表,其中标记是选项的名称,它会打印到stderr中,当选择时,并且是菜单选项的描述。

如果您要呈现一个很长的菜单,并希望充分利用可用的屏幕,您可以通过以下方式计算最佳框大小。

eval `resize`
whiptail ... $LINES $COLUMNS $(( $LINES - 8 )) ...
whiptail --checklist

复选框

[编辑 | 编辑源代码]

在某些情况下,您需要向用户呈现不适合放置在菜单中的选项。

复选框允许用户从列表中选择一个或多个选项。

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 --radiolist

单选框

[编辑 | 编辑源代码]

单选框是一个对话框,用户可以在其中从列表中选择一个选项。单选框和菜单的区别在于用户选择一个选项(在 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

进度条

[编辑 | 编辑源代码]

语法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
华夏公益教科书