опционально подсказывать пользователю меню на основе аргумента

Как я могу изменить приведенный ниже скрипт следующим образом:

  1. Если число передается в качестве аргумента ( не запрашивать пользователя ), не показывать меню параметров, проверьте, совпадает ли оно один из вариантов, и если это так, продолжите эту опцию
  2. Если номер не передан (, приглашение пользователя ), покажите меню опций 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
1
задан 15 December 2017 в 21:10

1 ответ

Вы можете извлечь обработку опций для функции:

handleOption() {
    local opt=$1
    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
}

И меню для другой функции:

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

И затем реализовать проверку первого аргумента командной строки:

  • Является ли оно целым числом?
  • Если это целое число, находится ли оно в диапазоне 1..${#options[@]}?
  • Если оба приведенных выше факта верны, то вызвать handleOption непосредственно с соответствующим значением из массива options

Как-то так:

arg=$1
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
3
ответ дан 15 December 2017 в 21:10

Другие вопросы по тегам:

Похожие вопросы: