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