Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 比较由数字组成的字符串_Bash_Shell - Fatal编程技术网

Bash 比较由数字组成的字符串

Bash 比较由数字组成的字符串,bash,shell,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的价值,并确定其中一个更高 编辑:更好地描述问题。这取决于解决方案所需的可移植性。如果您不关心这一点,并且使用基于deb的发行版,那么可以使用dpkg-compare ver

我试图比较两个变量的值,这两个变量都包含字符串作为数字。例如:

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的价值,并确定其中一个更高


编辑:更好地描述问题。

这取决于解决方案所需的可移植性。如果您不关心这一点,并且使用基于deb的发行版,那么可以使用dpkg-compare versions特性

然而,如果您需要在没有dpkg的发行版上运行脚本,我将使用以下方法

需要比较的值包括第一个元素和其他所有元素。第一个通常称为head和rest-tail,但我特意使用first和rest的名称,以避免与Unix系统上可用的head1和tail1工具混淆

如果first$var1不等于first$var2,您只需比较这些firsts元素。如果firsts相等,只需递归地在rest$var1和rest$var2上运行compare函数。作为一种边界情况,您需要决定如果值如下所示,该怎么办:

var1 = "2.3.4"
var2 = "2.3"
在某个步骤中,您将首先比较空和非空

实现first和rest函数的提示:

foo="2.3-4.5"
echo ${foo%%[^0-9][0-9]*}
echo ${foo#[0-9]*[^0-9]}
如果您不清楚这些,请阅读ManBash标题为“参数扩展”的部分。在手册中搜索字符串将立即显示确切的部分

另外,请确保您是在以数字形式而不是以词汇顺序比较元素。例如,比较以下命令的结果:

[[ 9 > 10 ]]; echo $?
[[ 9 -gt 10 ]]; echo $?
您可以使用[[${str1}<${str2}]]样式测试。这应该起作用:

function max()
{
    [[ "$1" < "$2" ]] && echo $2 || echo $1
}

max=$(max ${var5} ${var6})
echo "max=${max}."

请看这里:我不确定到底是什么问题。你能给我们一个完整的例子和期望的输出吗?谢谢!这会让我忙上一段时间:-我不确定这个问题是否能得到满意的回答。如您所愿,比较var5和var6需要一些语义知识,了解它们是如何生成的以及它们是如何使用的,因为这些表单的用法并不完全一致。有些人认为2.3-3等同于2.3.3——如果主要版本2的零点版本是次要版本3,则第三个或第四个版本。其他人则认为它相当于2.3.0-3——第三次或第四次重建/重新打包主要版本2次要版本3。使用相同的形式比较两个变量,即var1和var2,问题较少。太棒了!这让我达到了我想去的地方。谢谢