我怎样才能将下面的脚本更改如下:
- 如果将数字作为参数传递(不提示用户),不显示选项菜单,检查是否与其中一个选项匹配,如果匹配,则继续使用该选项
- 如果没有传递号码(用户提示), 显示 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
您可以将选项的处理提取到一个函数中:
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