我正在尝试编写一个函数,根据用户的选择重写值。到目前为止,它看起来像这样:
while [[ $code_id != [1-28] ]]; do
echo "Please select a value..."
echo "1. A"
echo "2. B"
echo "3. C"
echo "4. D"
...
echo "28. Z"
done
echo "INFO: Code is $code_id."
用户应该输入一个选定的数字(1-28)。但结果是,代码返回给我一个选择。我理解条件(while...do)中的原因,但我该如何编写才能使我的代码正常工作?
答案1
这是一个可能的解决方案,它使用内部有条件中断的无限循环。
#!/bin/bash
while true
do
read -p "Enter value: " value
if [[ $value =~ ^[0-9]{1,2}$ ]] && ((value <= 28)); then break; fi
# does it a number of one or two digits and if true, does it less or equal to 28?
done
echo "The value is: ${value}"
正则表达式中的范围与数学中的范围不同。将此处的范围视为来自ASCII 表. 因此字符集[1-28]
由1
、2
和组成8
。
这是另一个示例。字符集[a-dz]
包括范围内的字符a-d
,这些字符是、、、a
和字符。b
c
d
z
在 Bash 的执行条件测试中[[
,当=~
使用运算符时,运算符右边的字符串将作为正则表达式进行匹配。
答案2
看起来您想使用 Bash 的select
内置功能:
select code_id in {A..Z}; do
[[ -z $code_id ]] || break
done
echo "INFO: Code is ${code_id}."
输出:
1) A 3) C 5) E 7) G 9) I 11) K 13) M 15) O 17) Q 19) S 21) U 23) W 25) Y
2) B 4) D 6) F 8) H 10) J 12) L 14) N 16) P 18) R 20) T 22) V 24) X 26) Z
#? 6
INFO: Code is F.
您可能想要限制COLUMNS
例如:
COLUMNS=1
select code_id in {A..Z}; do
[[ -z $code_id ]] || break
done
echo "INFO: Code is ${code_id}."
输出:
1) A
2) B
3) C
4) D
5) E
6) F
7) G
8) H
9) I
10) J
11) K
12) L
13) M
14) N
15) O
16) P
17) Q
18) R
19) S
20) T
21) U
22) V
23) W
24) X
25) Y
26) Z
#? 17
INFO: Code is Q.
答案3
解决方案是将条件更改为while [[ $rep_id -le 0 || $rep_id -ge 13 ]]; do...