
動作するシンプルなbashメニュースクリプトがありますほとんど完璧です。しかし、何らかの理由で、「終了」オプションまたはCTRL+Cを使用してスクリプトを終了しないと、前にターミナル ウィンドウを閉じると、スクリプトが無限ループに入り、CPU 使用率が 4% から 50% に上昇します。その後、CPU 使用率を再び下げるには、「kill -9 bash」を使用してスクリプトを強制終了する必要があります。ただし、「Exit」または「CTRL+C」を使用してスクリプトを終了すると、問題なく動作します。
もちろん、理想的な世界では、ターミナル セッションを閉じる前に必ず Exit を実行しますが、これをワークフローに組み込むと、スクリプトを Exit せずにターミナル セッションを閉じることを忘れてしまうことが必ず起こります。そうすると、バックグラウンドで CPU 使用率が上昇することになります。
これは「while true; do」の使用と関係があることはわかっています。なぜなら、これを使い始める前は、この問題は発生していなかったからです。しかし、「while true; do」が必要なのです。そうしないと、サブメニューがメイン メニューに戻ったときにメイン メニュー オプションを表示しません。そのため、これを実装する必要がありました。
何か案は?
#!/bin/bash
main_menu () {
while true; do
clear
PS3='Select an option: '
options=("Option1" "Option2" "SubMenu" "Exit")
select opt in "${options[@]}";
do
case $opt in
"Option1")
echo ""
echo Option1
read -p ""
clear
break
;;
"Option2")
echo ""
echo Option2
read -p ""
clear
break
;;
"SubMenu")
while true; do
clear
PS3='Select an option: '
options=("SubMenu Option1" "SubMenu Option2" "Main Menu")
select opt in "${options[@]}"
do
case $opt in
"SubMenu Option1")
echo ""
echo "Sub-Menu Option1"
read -p ""
clear
break
;;
"SubMenu Option2")
echo ""
echo "Sub-Menu Option2"
read -p ""
clear
break
;;
"Main Menu")
break 3
;;
*) echo "invalid option"
;;
esac
done
done
;;
"Exit")
exit
;;
*) echo "invalid option"
;;
esac
done
done
}
main_menu