可选地根据参数提示用户菜单

可选地根据参数提示用户菜单

我怎样才能将下面的脚本更改如下:

  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

您可以将选项的处理提取到一个函数中:

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

相关内容