比较由数字组成的字符串

时间:2013-11-15 19:23:43

标签: bash shell

我正在尝试比较两个包含字符串作为数字的变量的值。例如:

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进行比较并确定其中一个值更高。

编辑:更好地描述问题。

2 个答案:

答案 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}."