オプションがリストの内容となるように bash メニュー スクリプトを記述するにはどうすればよいですか?

オプションがリストの内容となるように bash メニュー スクリプトを記述するにはどうすればよいですか?

私は汎用の bash メニュー スクリプトを使用しています:

#!/bin/bash
# Bash Menu Script Example

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
    esac
done

実行すると、次のようになります:

1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 

list.txt という名前のファイルがあります:

Android
iOS
Windows

オプションが list.txt の内容になるように bash メニュー スクリプトを記述するにはどうすればよいでしょうか。

1) Android
2) iOS
3) Windows
4) Quit
Please enter your choice: 

答え1

置き換えることができます

options=("Option 1" "Option 2" "Option 3" "Quit")

mapfile -t options < list.txt
options+=( "Quit" )

パターンを調整しますcase。変数の内容をテストする代わりに、選択した番号を含む を$opt使用すると、より簡単に確認できます。$REPLY

答え2

ファイルを配列に読み込みます。

#!/usr/bin/env bash

readarray -t list < list.txt

PS3='Please enter your choice or 0 to exit: '
select selection in "${list[@]}"; do
    if [[ $REPLY == "0" ]]; then
        echo 'Goodbye' >&2
        exit
    else
       echo $REPLY $selection
        break
    fi
done

関連情報