而 $value !=

而 $value !=

我正在尝试编写一个函数,根据用户的选择重写值。到目前为止,它看起来像这样:

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]12和组成8

这是另一个示例。字符集[a-dz]包括范围内的字符a-d,这些字符是、、、a和字符。bcdz

在 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...

相关内容