文章目录
Shell 脚本菜单示例
菜单式 Shell 脚本通常包括一个循环,显示菜单选项,等待用户输入,并根据用户选择执行不同的操作。下面是一个简单的示例,它展示了如何创建一个基本的菜单系统,并处理用户输入。
基本结构
以下是一个简单的菜单式 Shell 脚本的基本结构:
#!/bin/bash
# 显示菜单
show_menu() {
echo "选择一个操作:"
echo "1. 显示当前日期和时间"
echo "2. 查看系统信息"
echo "3. 列出当前目录文件"
echo "4. 退出"
}
# 执行用户选择的操作
perform_action() {
case $1 in
1)
echo "当前日期和时间:"
date
;;
2)
echo "系统信息:"
uname -a
;;
3)
echo "当前目录文件列表:"
ls
;;
4)
echo "退出"
exit 0
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
# 主程序
while true; do
show_menu
read -p "请输入你的选择 [1-4]: " choice
perform_action $choice
done
详细讲解
显示菜单 (show_menu
函数)
show_menu
函数负责显示所有可用的操作选项。它使用 echo
命令输出菜单内容。
执行操作 (perform_action
函数)
perform_action
函数根据用户的选择执行不同的操作。它使用 case
语句来匹配用户的选择并执行对应的命令。如果选择无效,脚本会提示用户重新输入。
主程序循环
while true
循环会持续运行,直到用户选择退出。每次循环时,脚本都会显示菜单并读取用户的选择,然后调用 perform_action
函数来执行相应的操作。
扩展功能
你可以根据需求扩展这个脚本。例如,添加更多的菜单选项,执行其他系统管理任务,或者将功能拆分到不同的脚本中。
添加日志功能
log_action() {
echo "$(date): $1" >> /var/log/menu_script.log
}
perform_action() {
case $1 in
1)
log_action "显示当前日期和时间"
echo "当前日期和时间:"
date
;;
2)
log_action "查看系统信息"
echo "系统信息:"
uname -a
;;
3)
log_action "列出当前目录文件"
echo "当前目录文件列表:"
ls
;;
4)
log_action "退出"
echo "退出"
exit 0
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
创建帮助选项
show_help() {
echo "帮助信息:"
echo "1. 显示当前日期和时间"
echo "2. 查看系统信息"
echo "3. 列出当前目录文件"
echo "4. 退出"
echo "5. 显示帮助"
}
perform_action() {
case $1 in
1)
echo "当前日期和时间:"
date
;;
2)
echo "系统信息:"
uname -a
;;
3)
echo "当前目录文件列表:"
ls
;;
4)
echo "退出"
exit 0
;;
5)
show_help
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
实用技巧
-
使用
select
命令: 如果你希望脚本中的菜单更具交互性,可以使用select
命令,它可以自动生成菜单和处理用户输入。PS3="请输入你的选择: " options=("显示当前日期和时间" "查看系统信息" "列出当前目录文件" "退出") select opt in "${options[@]}"; do case $opt in "显示当前日期和时间") date ;; "查看系统信息") uname -a ;; "列出当前目录文件") ls ;; "退出") break ;; *) echo "无效选择";; esac done
-
处理错误: 添加错误处理来增强脚本的鲁棒性,例如处理无效输入或命令失败的情况。
复杂的功能选项
你可以将菜单选项设计得更复杂,涵盖更多的系统操作或自动化任务。例如,添加网络管理、系统监控、用户管理等功能。
示例:
#!/bin/bash
show_menu() {
echo "选择一个操作:"
echo "1. 显示当前日期和时间"
echo "2. 查看系统信息"
echo "3. 列出当前目录文件"
echo "4. 网络状态检查"
echo "5. 磁盘使用情况"
echo "6. 用户管理"
echo "7. 退出"
}
perform_action() {
case $1 in
1)
echo "当前日期和时间:"
date
;;
2)
echo "系统信息:"
uname -a
;;
3)
echo "当前目录文件列表:"
ls
;;
4)
echo "网络状态:"
ifconfig
;;
5)
echo "磁盘使用情况:"
df -h
;;
6)
manage_users
;;
7)
echo "退出"
exit 0
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
manage_users() {
echo "用户管理:"
echo "1. 显示所有用户"
echo "2. 添加新用户"
echo "3. 删除用户"
echo "4. 返回主菜单"
read -p "请输入你的选择 [1-4]: " user_choice
case $user_choice in
1)
echo "所有用户:"
cut -d: -f1 /etc/passwd
;;
2)
read -p "请输入新用户名: " new_user
sudo useradd $new_user
;;
3)
read -p "请输入要删除的用户名: " del_user
sudo userdel $del_user
;;
4)
return
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
输入验证和错误处理
在脚本中加入输入验证和错误处理可以提升用户体验和脚本的稳定性。例如,确保用户输入的是有效的选项,处理命令执行失败的情况。
示例:
validate_input() {
if [[ ! $1 =~ ^[0-9]+$ ]] || [[ $1 -lt 1 ]] || [[ $1 -gt 7 ]]; then
echo "输入无效,请输入一个有效的选项 [1-7]."
return 1
fi
return 0
}
while true; do
show_menu
read -p "请输入你的选择 [1-7]: " choice
validate_input $choice
if [[ $? -eq 0 ]]; then
perform_action $choice
fi
done
持久化配置
通过配置文件持久化用户设置或脚本状态。例如,记录用户的选择或保存系统状态,以便在下次运行脚本时恢复。
示例:
CONFIG_FILE="$HOME/.menu_script_config"
load_config() {
if [[ -f $CONFIG_FILE ]]; then
source $CONFIG_FILE
else
echo "没有找到配置文件,使用默认设置。"
fi
}
save_config() {
echo "LAST_CHOICE=$1" > $CONFIG_FILE
}
while true; do
show_menu
read -p "请输入你的选择 [1-7]: " choice
validate_input $choice
if [[ $? -eq 0 ]]; then
save_config $choice
perform_action $choice
fi
done
后台任务和定时任务
实现后台任务和定时任务可以使脚本更强大。例如,安排定时备份,或者运行长时间的任务并将结果发送到用户的邮箱。
示例:
schedule_backup() {
echo "安排每日备份任务..."
echo "0 2 * * * /path/to/backup.sh" | sudo tee -a /etc/crontab
echo "备份任务已安排在每天凌晨2点运行。"
}
perform_action() {
case $1 in
1)
echo "当前日期和时间:"
date
;;
2)
echo "系统信息:"
uname -a
;;
3)
echo "当前目录文件列表:"
ls
;;
4)
schedule_backup
;;
5)
echo "退出"
exit 0
;;
*)
echo "无效选择,请重新输入。"
;;
esac
}
图形界面
对于有 GUI 需求的场景,可以使用 dialog
或 zenity
工具为菜单脚本添加图形界面。
示例(使用 dialog
):
#!/bin/bash
show_menu() {
dialog --title "菜单" --menu "选择一个操作:" 15 50 6 \
1 "显示当前日期和时间" \
2 "查看系统信息" \
3 "列出当前目录文件" \
4 "退出" \
2> /tmp/choice.txt
}
perform_action() {
choice=$(< /tmp/choice.txt)
case $choice in
1)
dialog --msgbox "当前日期和时间:$(date)" 10 50
;;
2)
dialog --msgbox "系统信息:$(uname -a)" 10 50
;;
3)
dialog --msgbox "当前目录文件列表:$(ls)" 10 50
;;
4)
clear
exit 0
;;
*)
dialog --msgbox "无效选择,请重新输入。" 10 50
;;
esac
}
while true; do
show_menu
perform_action
done
总结
菜单式 Shell 脚本提供了一个简单而有效的方式来组织和执行命令。通过合理设计菜单和功能,脚本可以大大提高工作效率和用户体验。希望这些示例和技巧能帮助你编写自己的菜单式 Shell 脚本。通过扩展菜单式脚本的功能,可以使其变得更加复杂和强大。你可以添加更多的功能选项、进行输入验证和错误处理、实现配置持久化、安排后台任务、甚至使用图形界面工具来提升用户体验。根据实际需求,你可以不断改进和丰富脚本的内容。