惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
博客园_首页
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
小众软件
小众软件
博客园 - 司徒正美
雷峰网
雷峰网
T
Tailwind CSS Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
罗磊的独立博客
量子位
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程
shell编程 - dialog 程序使用指南
箫笛 · 2026-05-17 · via 博客园 - 箫笛

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)

单选菜单:

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

七、注意事项

  1. 输出重定向:dialog 默认将结果输出到 stderr,建议用 --stdout3>&1 1>&2 2>&3 技巧捕获
  2. 终端尺寸:确保终端足够大以容纳对话框,否则会报错
  3. 退出码
    • 0 = OK / Yes
    • 1 = Cancel / No
    • 255 = ESC 键 / 错误
  4. 替代工具:现代替代方案有 whiptail(更轻量)、gum(更美观)、fzf(模糊搜索)