Duas seleções de menu no script Bash

Duas seleções de menu no script Bash

Estou aprendendo Bash e estou tentando resolver um exercício.

O exercício consiste em selecionar o nome e o sobrenome, em uma lista de menu. No entanto, se o nome não estiver na lista, defina a entrada manual.

Mas estou um pouco confuso porque não quando uma opção é selecionada, como ir para o segundo menu, sem selecionar a opção Sair (tento adicionar Break em qualquer opção, mas não funciona).

Para a entrada manual, tente ler a entrada do usuário, mas não vê nenhuma sugestão de trabalho?

Como posso encerrar o loop quando obtiver o nome e o sobrenome? Porque quando consigo os dois, chego ao mesmo loop.

echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

echo "Hello $opt Next Step is Select your Lastname "
done

PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
    case $opt2 in
        "Option 1")
            ;;
        "Option 2")
            ;;
        "Option 3")
            ;;
        "Option 4")
            echo "Sorry your Name is not in the List Give your name"
            read -e -p "Whats your name: " MANUALINPUT
            ;;
        "Quit")
            break
            ;;
   esac

clear
echo "Welcome $opt $opt2"
done

Responder1

O selectloop seria definido optpara a opção escolhida pelo usuário e definido $REPLYpara o que o usuário digitou. Portanto, se o usuário digitou 1como resposta à sua primeira pergunta, $REPLYseria 1e $optseria Elvis. Em nenhum momento $optseria Option 1. Torna mais fácil escrever suas casedeclarações para teste, $REPLYem vez de $opt.

Além disso, é muito cedo para cumprimentar a pessoa pelo nomedentroo selectloop, pois talvez ainda não tenhamos certeza de que temos um nome real para eles. O código entre o final da caseinstrução e o donefinal do selectloop é executado quando o usuário escolhe uminválidoescolha no menu (você também pode fazer isso com uma *)etiqueta de caixa).

Seria melhor usar nomes de variáveis ​​mais descritivos, como nameand family, e não precisamos de dois arrays separados para armazenar as opções (na verdade, é questionável se você precisa de arrays neste caso, pois poderíamos listar as strings diretamente) .

No código abaixo, também fiz o código terminar com exitif o usuário escolher Quit( breaksai do selectloop e o usamos quando o usuário escolhe um nome com sucesso). Todo o diálogo interativo acontece no fluxo de erros padrão, como é comum.

#!/bin/bash

PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your name is not in the list' >&2
            read -e -r -p "What's your name: " name
            break
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
   esac

   echo 'Try again!' >&2

done
printf 'Hello %s, now select your family name\n' "$name" >&2

PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
    case $REPLY in
        1|2|3)
            break       # user picked name from list
            ;;
        4)
            echo 'Sorry your family is not in the list' >&2
            read -e -r -p "What's your family: " family
            ;;
        5)
            echo 'Bye!' >&2
            exit
            ;;
    esac

    echo 'Try again!' >&2

done

printf 'Welcome, %s %s!\n' "$name" "$family"

Outras pequenas coisas corrigidas: Use -rwith readpara poder ler as barras invertidas corretamente, e você usou PS4em vez de PS3para definir o prompt de seleção no segundo loop.

informação relacionada