本帖最后由 zxxx 于 2022-5-2 22:38 编辑
来源:https://askubuntu.com/questions/1019213/display-grub-menu-and-options-without-rebooting
grub-menu.sh – bash script
- #!/bin/bash
-
- # NAME: grub-menu.sh
- # PATH: $HOME/bin
- # DESC: Written for AU Q&A: https://askubuntu.com/q/1019213/307523
- # DATE: Apr 5, 2018. Modified: May 7, 2018.
-
- # $TERM variable may be missing when called via desktop shortcut
- CurrentTERM=$(env | grep TERM)
- if [[ $CurrentTERM == "" ]] ; then
- notify-send –urgency=critical "$0 cannot be run from GUI without TERM environment variable."
- exit 1
- fi
-
- AllMenusArr=() # All menu options.
- # Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
- HideUpstartRecovery=false
- if [[ $1 == short ]] ; then
- HideUpstartRecovery=true # override default with first passed parameter "short"
- elif [[ $1 == long ]] ; then
- HideUpstartRecovery=false # override default with first passed parameter "long"
- fi
- SkippedMenuEntry=false # Don’t change this value, automatically maintained
- InSubMenu=false # Within a line beginning with `submenu`?
- InMenuEntry=false # Within a line beginning with `menuentry` and ending in `{`?
- NextMenuEntryNo=0 # Next grub internal menu entry number to assign
- # Major / Minor internal grub submenu numbers, ie `1>0`, `1>1`, `1>2`, etc.
- ThisSubMenuMajorNo=0
- NextSubMenuMinorNo=0
- CurrTag="" # Current grub internal menu number, zero based
- CurrText="" # Current grub menu option text, ie "Ubuntu", "Windows…", etc.
- SubMenuList="" # Only supports 10 submenus! Numbered 0 to 9. Future use.
-
- while read -r line; do
- # Example: " }"
- BlackLine="${line//[[:blank:]]/}" # Remove all whitespace
- if [[ $BlackLine == "}" ]] ; then
- # Add menu option in buffer
- if [[ $SkippedMenuEntry == true ]] ; then
- NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
- SkippedMenuEntry=false
- continue
- fi
- if [[ $InMenuEntry == true ]] ; then
- InMenuEntry=false
- if [[ $InSubMenu == true ]] ; then
- NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
- else
- NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
- fi
- elif [[ $InSubMenu == true ]] ; then
- InSubMenu=false
- NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
- else
- continue # Future error message?
- fi
- # Set maximum CurrText size to 68 characters.
- CurrText="${CurrText:0:67}"
- AllMenusArr+=($CurrTag "$CurrText")
- fi
-
- # Example: "menuentry ‘Ubuntu’ –class ubuntu –class gnu-linux –class gnu" …
- # "submenu ‘Advanced options for Ubuntu’ $menuentry_id_option" …
- if [[ $line == submenu* ]] ; then
- # line starts with `submenu`
- InSubMenu=true
- ThisSubMenuMajorNo=$NextMenuEntryNo
- NextSubMenuMinorNo=0
- SubMenuList=$SubMenuList$ThisSubMenuMajorNo
- CurrTag=$NextMenuEntryNo
- CurrText="${line#*’}"
- CurrText="${CurrText%%’*}"
- AllMenusArr+=($CurrTag "$CurrText") # ie "1 Advanced options for Ubuntu"
-
- elif [[ $line == menuentry* ]] && [[ $line == *"{"* ]] ; then
- # line starts with `menuentry` and ends with `{`
- if [[ $HideUpstartRecovery == true ]] ; then
- if [[ $line == *"(upstart)"* ]] || [[ $line == *"(recovery mode)"* ]] ; then
- SkippedMenuEntry=true
- continue
- fi
- fi
- InMenuEntry=true
- if [[ $InSubMenu == true ]] ; then
- : # In a submenu, increment minor instead of major which is "sticky" now.
- CurrTag=$ThisSubMenuMajorNo">"$NextSubMenuMinorNo
- else
- CurrTag=$NextMenuEntryNo
- fi
- CurrText="${line#*’}"
- CurrText="${CurrText%%’*}"
-
- else
- continue # Other stuff – Ignore it.
- fi
-
- done < /boot/grub/grub.cfg
-
- LongVersion=$(grub-install –version)
- ShortVersion=$(echo "${LongVersion:20}")
- DefaultItem=0
-
- if [[ $HideUpstartRecovery == true ]] ; then
- MenuText="Menu No. ———– Menu Name ———–"
- else
- MenuText="Menu No. ————— Menu Name —————"
- fi
-
- while true ; do
-
- Choice=$(whiptail
- –title "Use arrow, page, home & end keys. Tab toggle option"
- –backtitle "Grub Version: $ShortVersion"
- –ok-button "Display Grub Boot"
- –cancel-button "Exit"
- –default-item "$DefaultItem"
- –menu "$MenuText" 24 76 16
- "${AllMenusArr[@]}"
- 2>&1 >/dev/tty)
-
- clear
- if [[ $Choice == "" ]]; then break ; fi
- DefaultItem=$Choice
-
- for (( i=0; i < ${#AllMenusArr[@]}; i=i+2 )) ; do
- if [[ "${AllMenusArr[i]}" == $Choice ]] ; then
- i=$i+1
- MenuEntry="menuentry ‘"${AllMenusArr[i]}"’"
- break
- fi
- done
-
- TheGameIsAfoot=false
- while read -r line ; do
- if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
- if [[ $TheGameIsAfoot == true ]]; then
- echo $line
- if [[ $line = *"}"* ]]; then break ; fi
- fi
- done < /boot/grub/grub.cfg
-
- read -p "Press <Enter> to continue"
-
- done
-
- exit 0
复制代码
|