shell编程 - dialog 程序使用指南
Linux 中的 dialog 是一个经典的 TUI(文本用户界面)工具,用于在终端中创建交互式对话框。以下是完整的使用指南:
一、安装
# Debian/Ubuntu
sudo apt-get install dialog
# CentOS/RHEL/Fedora
sudo yum install dialog # 或 dnf install dialog
# Arch Linux
sudo pacman -S dialog
二、基本语法
dialog [通用选项] <框类型> <框选项> <框参数>
三、常用对话框类型
1. 消息框(msgbox)
显示信息,按 OK 继续:
dialog --msgbox "Hello, World!" 10 40
10= 高度(行数)40= 宽度(列数)
2. 确认框(yesno)
返回退出码:0=Yes, 1=No:
dialog --yesno "Are you sure?" 10 40
if [ $? -eq 0 ]; then
echo "You chose YES"
else
echo "You chose NO"
fi
3. 输入框(inputbox)
获取用户输入,结果输出到 stderr:
result=$(dialog --stdout --inputbox "Enter your name:" 10 40 "default")
echo "You entered: $result"
--stdout将结果输出到 stdout 而非 stderr"default"为默认值
4. 密码框(passwordbox)
隐藏输入内容:
password=$(dialog --stdout --passwordbox "Enter password:" 10 40)
5. 菜单(menu)
单选菜单:
choice=$(dialog --stdout --menu "Choose an option:" 15 50 4 \
1 "Option One" \
2 "Option Two" \
3 "Option Three" \
4 "Option Four")
echo "You chose: $choice"
15= 总高度50= 宽度4= 菜单项可见行数
6. 复选框(checklist)
多选,标记状态用 on/off:
choices=$(dialog --stdout --checklist "Select items:" 15 50 4 \
1 "Item A" on \
2 "Item B" off \
3 "Item C" on)
echo "Selected: $choices"
7. 单选列表(radiolist)
互斥单选:
choice=$(dialog --stdout --radiolist "Pick one:" 15 50 4 \
1 "Red" on \
2 "Green" off \
3 "Blue" off)
8. 进度条(gauge)
显示进度百分比:
(
echo "10" ; sleep 1
echo "50" ; sleep 1
echo "XXX" # 分隔符
echo "Halfway done..."
echo "XXX"
echo "75" ; sleep 1
echo "100"
) | dialog --gauge "Processing..." 10 40 0
9. 文件选择(fselect)
浏览选择文件:
file=$(dialog --stdout --fselect /home/user/ 20 60)
10. 日历/时间选择
# 日历
date=$(dialog --stdout --calendar "Select date:" 10 40 17 5 2026)
# 时间
time=$(dialog --stdout --timebox "Select time:" 10 40 16 30 00)
四、通用选项
| 选项 | 说明 |
|---|---|
--title "标题" |
设置窗口标题 |
--backtitle "背景标题" |
设置屏幕顶部背景标题 |
--stdout |
将结果输出到 stdout(默认是 stderr) |
--no-cancel |
隐藏 Cancel 按钮 |
--nocancel |
同上 |
--defaultno |
默认选中 No(用于 yesno) |
--default-item <id> |
设置默认选中项 |
--clear |
完成后清屏 |
--keep-window |
保留窗口内容(不覆盖) |
--colors |
支持颜色代码(如 \Z1 红色) |
--shadow |
显示阴影效果 |
--insecure |
密码框显示星号而非完全隐藏 |
五、颜色与样式
启用颜色支持:
dialog --colors --msgbox "\Z1Red\Zn \Z2Green\Zn \Z4Blue\Zn" 10 40
\Z0~\Z7= 颜色代码\Zn= 恢复正常颜色\Zb= 粗体,\Zr= 反色
六、完整示例脚本
#!/bin/bash
# 使用 dialog 创建交互式安装向导
# 设置背景标题
BACKTITLE="Server Setup Wizard v1.0"
# Step 1: 欢迎
dialog --backtitle "$BACKTITLE" --msgbox "Welcome to the setup wizard!" 10 40
# Step 2: 输入主机名
hostname=$(dialog --stdout --backtitle "$BACKTITLE" \
--inputbox "Enter hostname:" 10 40 "server01")
# Step 3: 选择服务
services=$(dialog --stdout --backtitle "$BACKTITLE" --checklist \
"Select services to install:" 15 50 4 \
"nginx" "Web Server" on \
"mysql" "Database" off \
"redis" "Cache Server" off \
"docker" "Container Runtime" on)
# Step 4: 确认
dialog --backtitle "$BACKTITLE" --yesno \
"Hostname: $hostname\nServices: $services\nProceed?" 10 50
if [ $? -eq 0 ]; then
dialog --backtitle "$BACKTITLE" --msgbox "Setup complete!" 10 40
else
dialog --backtitle "$BACKTITLE" --msgbox "Setup cancelled." 10 40
fi
# 清屏
clear
七、注意事项
- 输出重定向:dialog 默认将结果输出到 stderr,建议用
--stdout或3>&1 1>&2 2>&3技巧捕获 - 终端尺寸:确保终端足够大以容纳对话框,否则会报错
- 退出码:
0= OK / Yes1= Cancel / No255= ESC 键 / 错误
- 替代工具:现代替代方案有
whiptail(更轻量)、gum(更美观)、fzf(模糊搜索)

浙公网安备 33010602011771号