英文:
Comparing two version number in bash script not working properly
问题
你好,以下是翻译好的部分:
我正在使用bash脚本工作,对这个脚本很友好。我有一组数字如下:
1.0 1.1 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
我试图从上述数字中获取最高的数字。当我使用下面的脚本时,我得到的是1.9而不是1.16。你能帮忙吗?为了简单起见,我只取了3个数字:
a=1.9
b=1.16
max=1.9
if (( $(echo "$a < $b" | bc -l ) )); then
max=$b
fi
期望结果:1.16
实际结果:1.9
英文:
I am working in bash script and i am kind to this script. I have a number as follows
1.0 1.1 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
I am trying to get highest number from the above numbers. When i use the below script i am getting 1.9 instead of 1.16. Could you please help on this. For simple i have take 3 number
a=1.9
b=1.16
max=1.9
if (( $(echo "$a < $b" | bc -l ) )); then
max=$b
fi
Excepted result : 1.16
Actual result : 1.9
答案1
得分: 2
如果你想找到你的版本号列表中的最大版本号,你可以使用GNU sort
而不是 bc
,因为bc
没有原生操作符来比较版本号:
$ list=(1.0 1.1 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9)
$ printf '%s\n' "${list[@]}" | sort -rV | head -1
1.16
list=(1.0 ... 1.9)
将你的数字分配给bash数组list
。printf '%s\n' "${list[@]}"
以每行一个数字的方式打印列表。sort -rV
按版本号降序对行进行排序。head -1
只打印第一行。
要找到最小值,使用 sort -V
而不是 sort -rV
。
英文:
If what you want is to find the maximum of your list of numbers considered as version numbers you could use GNU sort
instead of bc
that has no native operator to compare version numbers:
$ list=(1.0 1.1 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9)
$ printf '%s\n' "${list[@]}" | sort -rV | head -1
1.16
list=(1.0 ... 1.9)
assigns your numbers to bash arraylist
.printf '%s\n' "${list[@]}"
prints the list with one number per line.sort -rV
sorts the lines in decreasing order of version numbers.head -1
prints only the first line.
To find the minimum use sort -V
instead of sort -rV
.
答案2
得分: 1
在这些情况下,使用awk更好。
#!/bin/bash
a=1.9
b=1.16
max=1.9
if awk -v num1="$a" -v num2="$b" 'BEGIN{if (num1>num2) exit 0; exit 1}'; then
max=$a
else
max=$b
fi
echo "最大的数是:$max"
这应该能起作用,也许你可以尝试使用for循环进行更大的比较。
英文:
In these cases using awk is better.
#!/bin/bash
a=1.9
b=1.16
max=1.9
if awk -v num1="$a" -v num2="$b" 'BEGIN{if (num1>num2) exit 0; exit 1}'; then
max=$a
else
max=$b
fi
echo "The highest number is: $max"
This should do the work, maybe you can try it using a for loop instead for larger comparisons.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论