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]}
而不是 1
和 2
.
由于数组值不是1
或2
,case
语句中的任何子句都不会匹配,所以case
语句什么也不做;在这种情况下,没有 break
被执行,因此 select
继续循环。
这是一个包含 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]}
而不是 1
和 2
.
由于数组值不是1
或2
,case
语句中的任何子句都不会匹配,所以case
语句什么也不做;在这种情况下,没有 break
被执行,因此 select
继续循环。