如何在Bash中基于efibootmgr制作带字母序列的可启动菜单
实现EFI启动项选择菜单脚本
以下是可直接使用的Bash脚本,完全匹配你的需求:
#!/bin/bash # 清屏 clear # 从efibootmgr提取带*标记的有效EFI启动项 efi_entries=$(efibootmgr | grep -E 'Boot[0-9]{4}\*' | awk '{sub(/Boot[0-9]{4}\*/, ""); print $0}') # 自定义启动项(可根据需求修改) custom_entries=( "MX23 LinuX" "Windows Boot Manager" "Setup" ) # 合并已有项与自定义项,生成完整菜单列表 menu_entries=() while IFS= read -r line; do menu_entries+=("$line") done <<< "$efi_entries" menu_entries+=("${custom_entries[@]}") # 生成带字母标记的菜单并展示 echo "请选择启动项:" echo "------------------------" alphabet=({A..Z}) for i in "${!menu_entries[@]}"; do echo "[${alphabet[$i]}] ${menu_entries[$i]}" done echo "------------------------" # 获取用户输入并转为大写(兼容小写输入) read -p "输入选项字母:" input input=$(echo "$input" | tr '[:lower:]' '[:upper:]') # 匹配用户选择的启动项 selected_entry="" for i in "${!menu_entries[@]}"; do if [[ "${alphabet[$i]}" == "$input" ]]; then selected_entry="${menu_entries[$i]}" break fi done # 执行对应启动操作 if [[ -z "$selected_entry" ]]; then echo "无效选项,退出脚本" exit 1 fi case "$selected_entry" in "ThrottleStop UEFI") sudo efibootmgr -n 0000 sudo reboot ;; "rEFInd Boot Manager") sudo efibootmgr -n 0001 sudo reboot ;; "MX23 LinuX") # 替换为MX23实际对应的Boot编号(参考你的BootOrder) sudo efibootmgr -n 0004 sudo reboot ;; "Windows Boot Manager") # 替换为Windows实际对应的Boot编号(参考你的BootOrder) sudo efibootmgr -n 0011 sudo reboot ;; "Setup") # 重启进入BIOS设置,部分系统可替换为对应命令 sudo systemctl reboot --firmware-setup ;; *) echo "未匹配到启动操作,请检查脚本配置" exit 1 ;; esac
使用步骤:
- 将代码保存为
efi_boot_menu.sh - 赋予执行权限:
chmod +x efi_boot_menu.sh - 运行脚本(需管理员权限):
sudo ./efi_boot_menu.sh
关键注意点:
- 脚本中的Boot编号(如0000、0001、0004)需对照你
efibootmgr输出的实际编号修改 - 若进入BIOS的命令不生效,可替换为你设备对应的BIOS启动命令
- 自定义启动项可直接修改
custom_entries数组内容
内容的提问来源于stack exchange,提问作者Mr.Key7
相关产品推荐
相关产品推荐

