Bash:select语句没有中断

时间:2015-01-29 23:57:13

标签: bash

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

,否则该语句不会中断
function func_set_branch () {
        local _file=$1
        local _expr=$2
        local _bdate=$3
        local _edate=$4
        local _mid=$(awk -F'\t' -v ref="${_expr}" 'BEGIN {IGNORECASE = 1} match($0, ref) {print $5}' "$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 ..没有骰子。在盯着这个waaaay太长时间后我错过了什么?

输出:

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

1 个答案:

答案 0 :(得分:3)

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

由于数组值不是12case语句中的子句不匹配,因此case语句将不执行任何操作;在这种情况下,不执行break,因此select继续循环。