необязательно запрашивать пользователя с меню, основанным на аргументе

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

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

2 ответа

можно извлечь регулировать параметры функции:

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
ответ дан 18 July 2018 в 01:07

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

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 }

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

Является ли это целым числом? Если это целое число, находится ли он в пределах диапазона 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
ответ дан 24 July 2018 в 17:20
  • 1
    Неплохо! Даже если это был вопрос о домашнем задании, им все равно придется поработать ... – Fabby 16 December 2017 в 01:04
  • 2
    @Fabby вы думаете, что это вопрос домашней работы? Тогда, я сказал слишком много: - / – janos 16 December 2017 в 01:05
  • 3
    Это пахнет, но у учителей тоже есть Интернет, вы знаете ... & gt;: -) – Fabby 16 December 2017 в 01:09

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

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