opcionalmente solicita ao usuário um menu baseado no argumento

1

Como posso alterar o script abaixo da seguinte forma:

  1. Se um número for passado como argumento ( não solicita ao usuário ), não mostre o menu de opções, verifique se ele corresponde a uma das opções e, em caso afirmativo, continue com essa opção
  2. Se o número não for passado ( prompt do usuário ), mostre o menu de opções 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
            ;;
        *) echo invalid option;;
    esac
done
    
por DarVar 15.12.2017 / 18:55

1 resposta

3

Você pode extrair o tratamento de opções para uma função:

handleOption() {
    local opt=
    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")
            return 1
            ;;
        *) echo invalid option;;
    esac
}

E o menu para outra função:

menu() {
    local PS3='Please enter your choice: '
    select opt in "${options[@]}"
    do
        handleOption "$opt" || break
    done
}

Em seguida, implemente a validação do primeiro argumento de linha de comando:

  • É um inteiro?
  • Se for um inteiro, está dentro do intervalo 1..${#options[@]} ?
  • Se as duas opções acima forem verdadeiras, chame o handleOption diretamente com o valor apropriado da options array

Algo parecido com isto:

arg=
if [[ $arg =~ ^[0-9]+$ ]] && (( 1 <= arg )) && (( arg <= ${#options[@]} )); then
    opt=${options[arg - 1]}
    handleOption "$opt"
elif [ "$arg" ]; then
    echo "warning: invalid option: $arg"
    menu
else
    menu
fi
    
por janos 15.12.2017 / 19:29