Bash: select 语句没有中断

Bash: select statement doesn't break

这是一个包含 select 语句的函数,除非您选择 'quit':

,否则该语句不会中断
function func_set_branch () {
        local _file=
        local _expr=
        local _bdate=
        local _edate=
        local _mid=$(awk -F'\t' -v ref="${_expr}" 'BEGIN {IGNORECASE = 1} match([=12=], ref) {print }' "$CONF")

        if (( $(grep -c . <<<"${_mid}") > 1 )); then
                mapfile -t arr <<< "${_mid}"

                PS3="Please choose an option "
                select option in "${arr[0]}" "${arr[1]}" quit
                do
                        case $option in
                                1) _mid="${arr[0]}"; break 2;;
                                2) _mid="${arr[1]}"; break 2;;
                                quit) exit 0;;
                        esac
                done
        fi

        sed "s#{{mid}}#${_mid}#
             s#{{bdate}}#${_bdate}#
             s#{{edate}}#${_edate}#" "$_file"
}

我试过不同级别的 break ..没有骰子。看了这么久,我错过了什么?

输出:

automation@automation-workstation2:~/scripts/branch-fines$ bash get_data.sh -f branch-fines.sql -B coulee -b 2014-01-01 -e 2014-12-31
coulee 2014-01-01 to 2014-12-31
1) 472754
2) 472758
3) quit
Please choose an option 1
Please choose an option 2
Please choose an option 3
automation@automation-workstation2:~/scripts/branch-fines$

更新

工作代码非常感谢 rici 和 glenn jackman。

PS3="Please choose an option "
select option in "${arr[0]}" "${arr[1]}" quit
do
    case $option in
        "${arr[0]}") MID="${arr[0]}"; break;;
        "${arr[1]}") MID="${arr[1]}"; break;;
        quit) exit 0;;
    esac
done

select 语句的主体中,指定的变量(在本例中为 $option)设置为所选单词的值,而不是其索引。这就是 quit 起作用的原因;您正在检查 $option 是否为 quit,而不是 3。同样,您应该检查 ${arr[0]}${arr[1]} 而不是 12.

由于数组值不是12case语句中的任何子句都不会匹配,所以case语句什么也不做;在这种情况下,没有 break 被执行,因此 select 继续循环。