Ubuntu下Bash Dialog脚本:日历、删除功能及按钮异常问题排查
基于Dialog的Bash交互脚本问题修复
问题描述
- 日历选项无法实现事件保存、检索、展示的预期功能
- 删除文件/文件夹功能仅支持手动输入路径,无GUI式文件浏览器选择
- 菜单的“OK”和“Cancel”按钮失效,需重新运行脚本才能切换选项
修复后的完整代码
#!/bin/bash # 创建空事件文件(如果不存在) touch events.txt while true; do # 显示主菜单 OPTION=$(dialog --menu "选择操作:" 0 0 0 \ 1 "保存事件" \ 2 "检索事件" \ 3 "展示所有事件" \ 4 "查看日期/时间" \ 5 "日历与事件管理" \ 6 "系统信息" \ 7 "CPU信息" \ 8 "挂载信息" \ 9 "删除文件" \ 10 "删除文件夹" \ 11 "内存信息" \ 12 "磁盘信息" \ 13 "退出" \ 3>&1 1>&2 2>&3 3>&- ) # 处理用户取消操作的情况 if [ -z "$OPTION" ]; then dialog --clear --msgbox "已取消操作" 0 0 continue fi case $OPTION in 1) # 修复保存事件功能:选择日期后输入事件 DATE=$(dialog --clear --calendar "选择要保存事件的日期:" 0 0 2>&1 1>&2) if [ $? -eq 0 ]; then EVENT=$(dialog --clear --inputbox "输入事件内容:" 0 0 2>&1 1>&2) if [ $? -eq 0 ]; then echo "$DATE:$EVENT" >> events.txt dialog --clear --msgbox "事件已保存" 0 0 fi fi ;; 2|5) # 整合检索事件和日历选项的功能,实现选择日期后查看/添加事件 DATE=$(dialog --clear --calendar "选择日期:" 0 0 2>&1 1>&2) if [ $? -eq 0 ]; then EVENT=$(grep "^$DATE:" events.txt | cut -d ':' -f 2-) if [ -z "$EVENT" ]; then EVENT=$(dialog --clear --inputbox "该日期无事件,输入新事件:" 0 0 2>&1 1>&2) if [ $? -eq 0 ]; then echo "$DATE:$EVENT" >> events.txt dialog --clear --msgbox "事件已添加" 0 0 fi else dialog --clear --msgbox "日期 $DATE 的事件:\n$EVENT" 0 0 fi fi ;; 3) if [ -s events.txt ]; then dialog --clear --msgbox "$(cat events.txt)" 0 0 else dialog --clear --msgbox "暂无事件记录" 0 0 fi ;; 4) dialog --clear --msgbox "$(date)" 0 0 ;; 6) dialog --clear --msgbox "$(uname -a)" 0 0 ;; 7) dialog --clear --msgbox "$(lscpu)" 0 0 ;; 8) dialog --clear --msgbox "$(mount)" 0 0 ;; 9) # 用--fselect实现GUI文件选择 FILE_PATH=$(dialog --clear --fselect "$HOME/" 0 80 2>&1 1>&2) if [ $? -eq 0 ]; then if [ -f "$FILE_PATH" ]; then rm "$FILE_PATH" dialog --clear --msgbox "文件 $FILE_PATH 已删除" 0 0 else dialog --clear --msgbox "选择的不是有效文件" 0 0 fi fi ;; 10) # 用--dselect实现GUI文件夹选择 FOLDER_PATH=$(dialog --clear --dselect "$HOME/" 0 80 2>&1 1>&2) if [ $? -eq 0 ]; then if [ -d "$FOLDER_PATH" ]; then rm -r "$FOLDER_PATH" dialog --clear --msgbox "文件夹 $FOLDER_PATH 已删除" 0 0 else dialog --clear --msgbox "选择的不是有效文件夹" 0 0 fi fi ;; 11) dialog --clear --msgbox "$(free -m)" 0 0 ;; 12) dialog --clear --msgbox "$(df -h)" 0 0 ;; 13) break ;; *) dialog --clear --msgbox "无效选项" 0 0 ;; esac done
关键修复说明
1. 日历选项功能完善
- 将原选项5(仅弹出日历)与选项2的事件检索/保存逻辑整合,选择日期后自动检查对应事件:
- 若存在事件则直接展示
- 若不存在则提示用户输入新事件并保存
- 修复了原选项1(保存事件)的逻辑错误,使其真正实现选择日期保存事件的功能
2. GUI式文件/文件夹选择
- 删除文件功能替换为
dialog --fselect,支持从GUI浏览器中选择文件,默认起始路径为用户主目录 - 删除文件夹功能替换为
dialog --dselect,同样支持GUI浏览选择,无需手动输入路径 - 移除了原脚本中可能导致脚本直接退出的
cd "$path" || exit,改用完整路径操作,避免意外退出
3. 按钮失效问题修复
- 改用
case语句替代原有的if-elif结构,更安全处理空值(用户按Cancel时$OPTION为空) - 添加了空值判断逻辑,当用户取消操作时显示提示并返回主菜单,而非进入错误分支
- 优化了事件文件为空时的提示,避免展示空内容给用户
内容的提问来源于stack exchange,提问作者AspiringCSStudent3
相关产品推荐
相关产品推荐

