2015-06-16 3 views
0

Для сценария bash для сравнения, если одна строка версии больше другой, как это сделать, если строка версии имеет 2 точки?Сравнение bash версий строк с 2 точками?

так, как сравнивать, чем версия 2.0.1, больше, чем 1.9.1? или что 1.8.5 меньше 1.9.5

веселит

+2

Связанный: http://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format – kojiro

ответ

-1

Вы можете использовать команду вырезать, указав -d «» опцию (разделитель) и -f, чтобы выбрать поле. При этом вы можете разбить каждую строку версии на компоненты и сравнить ее по своему усмотрению.

Возможно, вам также понадобится обработка ошибок, например, строки с 1 точкой и т. Д.

В качестве альтернативы, если ваши строки особенно предсказуемы, вы можете использовать sed, чтобы вырезать точки и сравнить полученные строки. Для этого требуется множество ограничений, поэтому 2.10.1 больше 2.3.1

+0

Это скорее комментарий, чем ответ на вопрос. * Как бы вы использовали результаты 'cut' для сравнения? Как бы вы разделили '.' на' sed' и сравнили полученные строки? Как вы поймаете ошибки, используя либо предлагаемый метод? – chepner

+0

Stackoverflow предназначен для предоставления ответов, как и я. Это не для выполнения всей работы для ОП. Если он попросит примеры использования sed или cut, я буду рад предоставить некоторые из них. Пока он не знает (он уже знает их). Мой ответ не достоин ни слова, сэр. – donjuedo

1

Учитывая то, что у вас есть, вы также можете удалить точки и обработать их как числа. Что-то вроде этого:

#!/bin/sh 
# 

v1='2.0.1' 
v2='1.9.1' 

nv1=`echo $v1 | sed 's/\.//g'` 
nv2=`echo $v2 | sed 's/\.//g'` 

if [[ nv1 -gt nv2 ]]; then 
    echo "$v1 > $v2" 
else 
    echo "$v1 <= $v2" 
fi 

Результаты в:

$ ./test.sh 
2.0.1 > 1.9.1 
+1

По крайней мере, пока вы не нажмете версию '1.10.0' ... т.е. это работает только до тех пор, пока каждый« компонент »представляет собой одну цифру (или, в более общем плане, они имеют одинаковое количество цифр - он может работать с NN. MM.JJ тоже ...) – twalberg

0

Вы можете разбить строку версии следующим образом без дорогих вилок cut или любой другой. Это работает во всех оболочках, полученных из Бурна.

$ x=11.12.13 
$ first=${x%%.*}   # Delete first dot and what follows. 
$ last=${x##*.}   # Delete up to last dot. 
$ mid=${x##$first.}  # Delete first number and dot. 
$ mid=${mid%%.$last}  # Delete dot and last number. 
$ echo $first $mid $last # Voila! 
11 12 13 

Затем сравните с численно

if test $first -gt 1; then 
    ... 
fi 

Вы получаете идею.