(("$number" >= 1 && "$number" <= 3)) 是 Bash 的独立算术表达式。
在算术表达式中,变量按原样扩展,如果它们包含有效的算术表达式的语法元素,这些元素也会被解释。
number="3,2" 在算术表达式中扩展为((3,2)),其中逗号, 被Bash 的算术表达式解释为语句分隔符。
让我们看看:
$ number="3,2"; echo "$((number))"
2
$ number="3+2"; echo "$((number))"
5
$ number="3*2"; echo "$((number))"
6
shell 只理解整数运算,但3,2 不是有效的整数值。
这意味着如果您不确定变量是否包含有效整数,则在算术表达式中使用它是不安全的。
在用于算术表达式或在比较整数的测试中使用之前,请始终检查 number 是否包含有效整数(请参阅:Test whether string is a valid integer)。
# Check number is a valid integer before testing its range.
[[ $number =~ ^[-+]?[0-9]+$ ]] && (("$number" >= 1 && "$number" <= 3))
其他答案中建议的其他数字测试方法[ "$number" -ge 1 ] && [ "$number" -le 3 ] 将出错:bash: [: 3,2: integer expression expected。
还需要对有效整数进行测试:
[[ $number =~ ^[-+]?[0-9]+$ ]] && [ "$number" -ge 1 ] && [ "$number" -le 3 ]
使用 POSIX shell,没有 Regex 测试,因此需要不同的方法:
case "${number#[+-]}" in(*[!0123456789]*|'')false;;esac &&
[ "$number" -ge 1 ] && [ "$number" -le 3 ]
关于使用算术表达式比较数字的陷阱的附加说明。算术表达式会将整数的前导 0 处理为八进制:
$ (( 13 >= 12 )); echo $?
0
但是
$ (( 013 >= 12 )); echo $?
1