bash - 为什么 bash 按字典顺序而不是数字方式评估数字的比较?
问题描述
有人可以解释 bash 的“ if ”块的以下行为吗?
我使用以下简单代码检查first_value是否小于second_value
first_value=67
second_value=2
if [[ "${first_value}" < "${second_value}" ]];
then
echo "Yes"
else
echo "No"
fi
问题是
如果second_value是 1,2,3,4,5,6,10,11,... 块将返回“No”
但如果second_value为 7,8,9,则该块将返回“Yes”(必须为“No”)
解决方法是使用“ -lt ”而不是“ < ”,但我想了解“ if ”块的这种行为。
bash 版本是“GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)”
操作系统是“CentOS Linux release 7.5.1804 (Core)”
解决方案
这种行为的原因是由于括号[[ "${first_value}" < "${second_value}" ]]
,实际上是字典比较。[[ exp ]]
正如问题中提到的OP,可能的解决方法是使用-lt
运算符。
在 bash 中,您可以使用算术上下文:
if (( $first_value < $second_value ));
then
echo "Yes"
else
echo "No"
fi
甚至更简单
if (( first_value < second_value ));
then
echo "Yes"
else
echo "No"
fi
推荐阅读
- angular - 是否有可能从特定 ID 获取数据,数据未显示
- java - .xml 无法打开,因为它不存在,但它确实存在于同一个包中
- r - 如何使用循环创建多个向量
- recursion - 记忆一个无效的递归函数
- java - netbeans 8.2 的 Python 插件
- javascript - 从节点 js 中的大型 json 文件中搜索特定对象
- android - 防止布局在android中调整大小
- javascript - 为什么我的组件使用 React.memo 重新渲染
- python - 当静音用户离开服务器并重新加入时,如何保持静音角色?
- swift - 某些 EXIF 元数据不会在 Swift 中更新