我正在尝试比较两个包含字符串作为数字的变量的值。例如:
var1="5.4.7.1"
var2="6.2.4.5"
var3="1-4"
var4="1-5"
var5="2.3-3"
var6="2.3.4"
可悲的是,我甚至不知道从哪里开始......任何帮助都将不胜感激!
我的意思是如何将$ var5的值与$ var6进行比较并确定其中一个值更高。
编辑:更好地描述问题。
答案 0 :(得分:0)
这取决于解决方案所需的可移植性。如果您不关心它并使用基于deb的发行版,则可以使用dpkg --compare-versions功能。
但是,如果您需要在没有dpkg的情况下在发行版上运行脚本,我会使用以下方法。
您需要比较的值包括第一个(第一个元素)和其余(所有其他元素)。第一个通常称为头部和其余部分,但我故意首先使用名称并休息,以免与Unix系统上可用的head(1)和tail(1)工具混淆。
如果第一个($ var1)不等于第一个($ var2),你只需比较那些第一个元素。如果第一次相等,则只需在rest($ var1)和rest($ var2)上递归运行compare函数。作为边界案例,如果值类似,您需要决定该怎么做:
var1 = "2.3.4"
var2 = "2.3"
在某些步骤中,您将首先比较空和非空。
提示实现第一个和休息函数:
foo="2.3-4.5"
echo ${foo%%[^0-9][0-9]*}
echo ${foo#[0-9]*[^0-9]}
如果您不清楚这些,请阅读标题为参数扩展的man bash部分。在手册中搜索##字符串会立即显示确切的部分。
另外,请确保您在数字上比较元素而不是词汇顺序。例如,比较以下命令的结果:
[[ 9 > 10 ]]; echo $?
[[ 9 -gt 10 ]]; echo $?
答案 1 :(得分:0)
您可以使用[[ ${str1} < ${str2} ]]
样式测试。这应该有效:
function max()
{
[[ "$1" < "$2" ]] && echo $2 || echo $1
}
max=$(max ${var5} ${var6})
echo "max=${max}."