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

七、注意事项

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

posted @ 2026-05-17 16:30  箫笛  阅读(39)  评论(0)    收藏  举报