Как я могу увеличить номер версии с помощью Bash - PullRequest
6 голосов
/ 20 декабря 2010

Я хотел бы знать, как увеличить последнюю цифру в номере версии, используя bash.

, например

VERSION=1.9.0.9
NEXT_VERSION=1.9.0.10

РЕДАКТИРОВАТЬ: номер версии будет содержать только натуральные числа.

Может ли решение быть общим для обработки любого количества деталей в номере версии.

1010 *, например *

1.2
1.2.3
1.2.3.4
1.2.3.4.5

Ответы [ 3 ]

8 голосов
/ 20 декабря 2010

Давайте начнем с основного ответа Майкла:

VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"

for VERSION in $VERSIONS; do 
    echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done

Как мы можем улучшить это? Вот несколько идей, извлеченных из обильного набора комментариев.

Конечный «1» в программе имеет решающее значение для ее работы, но это не самый явный способ сделать что-либо. Нечетное '1' в конце является логическим значением, которое имеет значение true, и поэтому соответствует каждой строке и запускает действие по умолчанию (так как после него нет фигурных скобок), которое должно вывести $ 0, строку читать, как исправлено предыдущая команда.

Следовательно, почему не эта команда awk, которая отменяет команду sed?

awk -F. '{$NF+=1; OFS="."; print $0}'

Конечно, мы могли бы уточнить вещи дальше - в несколько этапов. Вы можете использовать оператор перенаправления строк «<<<», чтобы избежать конвейера: </p>

awk -F. '...' <<< $VERSION

Следующим наблюдением будет то, что при наличии ряда строк одно выполнение awk может их обработать:

echo "$VERSIONS" | awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}'

без цикла for. Двойные кавычки вокруг "$ VERSION" сохраняют символы новой строки в строке. Труба все еще не нужна, что приводит к:

awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}' <<< "$VERSIONS"

Регулярное выражение игнорирует пустые строки в $VERSION, обрабатывая только те строки, которые содержат цифру, за которой следует точка. Конечно, установка OFS в каждой строке немного неуклюжа, и «+=1» может быть сокращено до «++», поэтому вы можете использовать:

awk -F. '/[0-9]+\./{$NF++;print}' OFS=. <<< "$VERSIONS"

(или вы можете включить в программу 'BEGIN{OFS="."}', но это довольно многословно.

Обозначение <<< поддерживается только Bash, а не Korn, Bourne или другими оболочками POSIX (за исключением нестандартного расширения, параллельного нотации Bash). Программа AWK будет поддерживаться любой версией awk, которую вы, вероятно, сможете использовать (но назначение переменных в командной строке не поддерживалось старой UNIX 7-й редакцией AWK).

5 голосов
/ 20 декабря 2010

Я придумал это.

VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"

for VERSION in $VERSIONS; do 
    echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done
2 голосов
/ 20 декабря 2010
if [[ "$VERSION" == *.* ]]; then
    majorpart="${VERSION%.*}."
else
    majorpart=""
fi
minorpart="${VERSION##*.}"
NEXT_VERSION="$majorpart$((minorpart+1))"

Предупреждение: если младшая часть номера версии не в ожидаемом формате (целое число, без начальных нулей), это может вызвать проблемы.Некоторые примеры: "1.033" -> "1.28" (поскольку 033 восьмерично для 27), "1.2.b" -> "1.2.1" (если b не определенная переменная, она будет рассматриваться как 0), "1.2.3a "-> ошибка (" 3a "не является числом).В зависимости от того, сколько дел вы хотите охватить, это можно сделать сколь угодно сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...