如何在bash中使用select进行通用菜单?

时间:2016-06-28 01:48:53

标签: bash shell menu

followed instructions in this link使用select创建一个特定的四选项菜单:

function showMenu() {
    PS3=$1
    shift
    options=("$@")
    select opt in "${options[@]}"
    do
        case $opt in
            ${options[0]})
                echo "${options[0]}"
                break
                ;;
            ${options[1]})
                echo "${options[1]}"
                break
                ;;
            ${options[2]})
                echo "${options[2]}"
                break
                ;;
            ${options[3]})
                echo "${options[3]}"
                break
                ;;
            *)  # just loop ...
                ;;
        esac
    done
}

这在以下方式调用时效果很好:

COLORS=("red" "blue" "green" "yellow")
COLOR=$(showMenu 'Choose a color' "${COLORS[@]}")
# if user inputs a '1', then COLOR would be blue

在shell脚本中,我需要有多个菜单,而我可以根据选项的数量(例如3,4,5等)编写函数,该函数本质上是同一构造的副本。有没有办法编写一个通用菜单,在select/case中显示与传递数组中的值一样多的选项?

例如,如何创建一个具有通用菜单容量的功能,该功能两个如上所述(对于四种颜色),如下所示(对于五个文件夹)?

FOLDERS=("foo", "bar", "baz", "too", "moo")
FOLDER=$(genericSelect 'Choose a folder' "${FOLDERS[@]}")
# if user inputs a '3', then FOLDER would be too

1 个答案:

答案 0 :(得分:1)

试试这个:

function showMenu() {
    PROMPT=$1
    shift
    options=("$@")
    numOptions=${#options[@]}
    read -p "${PROMPT}: " response
    echo "${options[$response]}"
}

请注意,这只是一块骨头 - 那里没有错误处理! :)