linux - 两个整数之间的 Bash 值,而不是浮点数
问题描述
我有这个简单的比较运算符,它检查是否number
在 1 和 3 之间(也包括 1 和 3)。但是,如果我分配number
给它,3,2
它仍然认为是正确的。
它应该只接受那些值1-2-3
我的代码
if (("$number" >= 1 && "$number" <= 3)); then
echo 'Correct number'
fi
解决方案
(("$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
包含有效整数(请参阅:测试字符串是否为有效整数)。
# 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
推荐阅读
- react-native - 从任何地方导航到子屏幕
- java - 使用正则表达式在字符串中搜索子字符串
- node.js - nodejs/vanilla 中的 Apollo-client 未触发订阅
- entity-framework - 为什么 IMutableEntityType.BaseType 对于直接从基类继承的实体为空?
- c# - Unity中未分配的变量
- azure - 使用任何配置禁用某些 Azure 功能
- elasticsearch - 创建索引时如何解决“无法解析内容以映射”错误?
- graphics - Graphics.set_font Ocaml
- intellij-idea - 在 IntelliJ 上使用 glassfish(payara) 服务器的 web.xml 错误
- c# - 将 asp.net 核心自包含 Web 应用程序部署到 Ubuntu。数据库名称在 appsettings.json 中存在时为空