
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 case
patrones. En lugar de probar el contenido de la $opt
variable, puede usar $REPLY
la 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