bash - 排序在 bash 中无法正常工作
问题描述
我有一个VarExp
具有以下 2 个值的变量
1.5.2
1.5.3
我有另一个VarCurr
具有以下 1 值的变量
1.8.1
我想比较VarCurr
并且VarExp
只想echo SUCCESS
当
VarCurr >= VarExp
我已经编写了以下代码,但它总是返回FAILURE
VarExp='1.5.2 1.5.3'
VarCurr='1.8.1'
printf -v versions '%s\n%s' "$VarExp" "$VarCurr"
if [[ $versions = "$(sort -V <<< "$versions")" ]]; then
echo 'FAILURE'
else
echo 'SUCCESS'
fi
VarCurr
需要 >= 中包含的最小值VarExp
解决方案
我建议使用能够正确客观化版本对象并且可以理解major.minor.build.revision 的语言。这是一个从 Perl 借用的示例 bash 脚本进行版本解析:
#!/bin/bash
VarExp='1.5.2 1.5.3'
VarCurr='1.8.1'
for i in $VarExp; do {
perl -e 'use version;exit !(version->parse('$VarCurr') >= version->parse('$i'));' && {
echo 'SUCCESS'
exit
}
}; done
echo 'FAILURE'
exit
当然,用 Perl 编写整个内容可能更优雅。
编辑:这是另一个使用 Python 的示例:
#!/bin/bash
VarExp='1.5.3 1.5.6'
VarCurr='1.5.3'
for i in $VarExp; do {
python -c 'from distutils.version import LooseVersion;\
exit(LooseVersion("'$VarCurr'") >= LooseVersion("'$i'"))' || {
echo 'SUCCESS'
exit
}
}; done
echo 'FAILURE'
exit
推荐阅读
- c# - 向 csv 阅读器添加错误处理以检测空文件或不正确的数据类型
- reactjs - 使用 cdn 的材料图标而不是显示其文本时,图标未在反应中显示
- jupyter-notebook - .ipynb 'notebook' 嵌入的图像在我更改代码时会消失。如何将它们上传到 jupyter 以便我可以更改代码?
- python - 访问模板中的视图变量
- reactjs - 反应克隆和附加子
- functional-programming - 如何创建记录值数组
- delphi - 从资源加载时如何使 TBitmap 透明
- c# - JIRA SDK C# - 无法为 CustomField 保存值
- javascript - 使用白名单对象验证 url 字符串
- javascript - Cesium Cartesian3 垂直向上移动