是否有办法在bash上比较这些字符串,例如:2.4.5和2.8和2.4.5.1?
当前回答
GNU排序有一个选项:
printf '2.4.5\n2.8\n2.4.5.1\n' | sort -V
给:
2.4.5
2.4.5.1
2.8
其他回答
另一种方法(@joynes的修改版本)比较问题中问到的虚线版本 (即“1.2”、“2.3.4”、“1.0”、“1.10.1”等)。 最大数量的位置必须事先知道。该方法期望最多3个版本位置。
expr $(printf "$1\n$2" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -g | sed -n 2p) != $2
使用示例:
expr $(printf "1.10.1\n1.7" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -g | sed -n 2p) != "1.7"
返回:1,因为1.10.1大于1.7
expr $(printf "1.10.1\n1.11" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -g | sed -n 2p) != "1.11"
返回:0,因为1.10.1比1.11低
感谢Dennis的解决方案,我们可以扩展它以允许比较运算符'>','<','=','==','<='和'>='。
# compver ver1 '=|==|>|<|>=|<=' ver2
compver() {
local op
vercomp $1 $3
case $? in
0) op='=';;
1) op='>';;
2) op='<';;
esac
[[ $2 == *$op* ]] && return 0 || return 1
}
然后我们可以在表达式中使用比较运算符,比如:
compver 1.7 '<=' 1.8
compver 1.7 '==' 1.7
compver 1.7 '=' 1.7
并且只测试结果的真/假,比如:
if compver $ver1 '>' $ver2; then
echo "Newer"
fi
对于旧版本/busybox排序。简单的形式提供了粗略的结果,往往奏效。
sort -n
这是特别有用的版本,其中包含alpha符号,如
10.c.3
10.a.4
2.b.5
GNU排序有一个选项:
printf '2.4.5\n2.8\n2.4.5.1\n' | sort -V
给:
2.4.5
2.4.5.1
2.8
### the answer is does we second argument is higher
function _ver_higher {
ver=`echo -ne "$1\n$2" |sort -Vr |head -n1`
if [ "$2" == "$1" ]; then
return 1
elif [ "$2" == "$ver" ]; then
return 0
else
return 1
fi
}
if _ver_higher $1 $2; then
echo higher
else
echo same or less
fi
它非常简单和小。