¿Cómo escribo un script de menú bash para que las opciones sean el contenido de una lista?

¿Cómo escribo un script de menú bash para que las opciones sean el contenido de una lista?

Estoy trabajando con un script de menú bash genérico:

#!/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

Cuando se ejecuta, se lee como:

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

Tengo un archivo llamado list.txt:

Android
iOS
Windows

¿Cómo escribo el script del menú bash para que las opciones sean el contenido de list.txt?

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

Respuesta1

podrías reemplazar

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

con

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

y ajusta tus casepatrones. En lugar de probar el contenido de la $optvariable, puede usar $REPLYla que contiene el número seleccionado y es más fácil de verificar.

Respuesta2

Lea el archivo en una matriz:

#!/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

información relacionada