有什么方法可以在bash上比较这样的字符串,例如:2.4.5
and 2.8
和2.4.5.1
吗?
这是一个纯Bash版本,不需要任何外部实用程序:
#!/bin/bash
vercomp () {
if [[ $1 == $2 ]]
then
return 0
fi
local IFS=.
local i ver1=($1) ver2=($2)
# fill empty fields in ver1 with zeros
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
do
ver1[i]=0
done
for ((i=0; i<${#ver1[@]}; i++))
do
if [[ -z ${ver2[i]} ]]
then
# fill empty fields in ver2 with zeros
ver2[i]=0
fi
if ((10#${ver1[i]} > 10#${ver2[i]}))
then
return 1
fi
if ((10#${ver1[i]} < 10#${ver2[i]}))
then
return 2
fi
done
return 0
}
testvercomp () {
vercomp $1 $2
case $? in
0) op='=';;
1) op='>';;
2) op='<';;
esac
if [[ $op != $3 ]]
then
echo "FAIL: Expected '$3', Actual '$op', Arg1 '$1', Arg2 '$2'"
else
echo "Pass: '$1 $op $2'"
fi
}
# Run tests
# argument table format:
# testarg1 testarg2 expected_relationship
echo "The following tests should pass"
while read -r test
do
testvercomp $test
done << EOF
1 1 =
2.1 2.2 <
3.0.4.10 3.0.4.2 >
4.08 4.08.01 <
3.2.1.9.8144 3.2 >
3.2 3.2.1.9.8144 <
1.2 2.1 <
2.1 1.2 >
5.6.7 5.6.7 =
1.01.1 1.1.1 =
1.1.1 1.01.1 =
1 1.0 =
1.0 1 =
1.0.2.0 1.0.2 =
1..0 1.0 =
1.0 1..0 =
EOF
echo "The following test should fail (test the tester)"
testvercomp 1 1 '>'
运行测试:
$ . ./vercomp
The following tests should pass
Pass: '1 = 1'
Pass: '2.1 < 2.2'
Pass: '3.0.4.10 > 3.0.4.2'
Pass: '4.08 < 4.08.01'
Pass: '3.2.1.9.8144 > 3.2'
Pass: '3.2 < 3.2.1.9.8144'
Pass: '1.2 < 2.1'
Pass: '2.1 > 1.2'
Pass: '5.6.7 = 5.6.7'
Pass: '1.01.1 = 1.1.1'
Pass: '1.1.1 = 1.01.1'
Pass: '1 = 1.0'
Pass: '1.0 = 1'
Pass: '1.0.2.0 = 1.0.2'
Pass: '1..0 = 1.0'
Pass: '1.0 = 1..0'
The following test should fail (test the tester)
FAIL: Expected '>', Actual '=', Arg1 '1', Arg2 '1'
问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个
问题内容: 我有两个 HH:MM:SS 格式的时间字符串。例如,contains , contains 。 如何比较以上数值? 问题答案: 1月1日是一个任意日期,并不代表任何意义。
问题内容: 我的表中有固件版本字符串(例如“ 4.2.2”或“ 4.2.16”) 如何比较,选择或排序它们? 我无法使用标准字符串比较:SQL看到的“ 4.2.2”大于“ 4.2.16” 作为版本字符串,我希望4.2.16大于4.2.2 我想考虑一下固件版本中可以包含chars的原因:4.24a1、4.25b3 …为此,通常,具有chars的子字段具有固定的长度。 如何进行 ? 问题答案: 最终,
问题内容: 是否有用于比较版本号的标准习语?我不能只使用直接的String compareTo,因为我尚不知道最大的点释放数将是多少。我需要比较版本,并满足以下条件: 问题答案: 用点作为定界符标记字符串,然后从左侧开始并排比较整数转换。
为什么下面的bash代码不起作用? 预期产出:
我无法进行数字比较: 问题是,它从第一个数字开始比较数字,即9大于10,但1大于09。 我如何将数字转换成一种类型来进行真正的比较?