Bash

bash腳本中的多選菜單

  • January 27, 2022

我是 bash 新手,但我想創建一個腳本,允許使用者從選項列表中選擇多個選項。

基本上我想要的是類似於下面的例子:

      #!/bin/bash
      OPTIONS="Hello Quit"
      select opt in $OPTIONS; do
          if [ "$opt" = "Quit" ]; then
           echo done
           exit
          elif [ "$opt" = "Hello" ]; then
           echo Hello World
          else
           clear
           echo bad option
          fi
      done

(來自http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1

但是我的腳本會有更多選項,我想允許選擇多個。所以是這樣的:

  1. 選項 1

  2. 選項 2

  3. 選項 3

  4. 選項 4

  5. 完成

對他們選擇的那些有回饋也很好,例如在他們已經選擇的那些旁邊加號。例如,如果您選擇“1”,我想分頁清除並重新列印:

1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done

然後,如果您選擇“3”:

1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done

此外,如果他們再次選擇 (1) 我希望它“取消選擇”該選項:

1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done

最後,當按下完成時,我希望在程序退出之前選擇要顯示的列表,例如,如果目前狀態是:

1) Option 1
2) Option 2 +
3) Option 3 + 
4) Option 4 +
5) Done

按 5 應列印:

Option 2, Option 3, Option 4

…並且腳本終止。

所以我的問題 - 這在 bash 中是否可行,如果可以,是否有人能夠提供程式碼範例?

任何建議將不勝感激。

我認為你應該看看dialogwhiptail

對話框

編輯:

這是使用您問題中的選項的範例腳本:

#!/bin/bash
cmd=(dialog --separate-output --checklist "Select options:" 22 76 16)
options=(1 "Option 1" off    # any option can be set to default to "on"
        2 "Option 2" off
        3 "Option 3" off
        4 "Option 4" off)
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
clear
for choice in $choices
do
   case $choice in
       1)
           echo "First Option"
           ;;
       2)
           echo "Second Option"
           ;;
       3)
           echo "Third Option"
           ;;
       4)
           echo "Fourth Option"
           ;;
   esac
done

引用自:https://serverfault.com/questions/144939