Ответ 1
$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14
Я пытаюсь написать bash script, который увеличивает номер версии, указанный в
{major}.{minor}.{revision}
Например.
1.2.13
Есть ли хороший способ легко извлечь эти 3 числа, используя что-то вроде sed или awk, чтобы я мог увеличивать число {ревизия} и выводить полную строку номера версии.
$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14
Pure Bash с использованием массива:
version='1.2.33'
a=( ${version//./ } ) # replace points, split into array
((a[2]++)) # increment revision (or other part)
version="${a[0]}.${a[1]}.${a[2]}" # compose new version
Я предпочитаю команду "cut" для такого рода вещей
major=`echo $version | cut -d. -f1`
minor=`echo $version | cut -d. -f2`
revision=`echo $version | cut -d. -f3`
revision=`expr $revision + 1`
echo "$major.$minor.$revision"
Я знаю, что это не самый короткий путь, но для меня это проще всего понять и прочитать...
Я использую собственное разделение слова оболочки; что-то вроде
oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"
хотя вам нужно быть осторожным с номерами версий в целом из-за буквенных или суточных дат и других досадных несогласованных битов. После этого позиционные параметры будут установлены на компоненты $version
:
$1 = 1
$2 = 2
$3 = 13
($IFS
- это набор одиночных символов, а не строка, поэтому это не будет работать с разделителем полей нескольких символов, хотя вы можете использовать IFS=.-
для разделения на .
или -
.)
Еще один способ оболочки (показывающий всегда больше, чем один способ обманывать этот материал...):
$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4
Итак, мы можем сделать:
$ x=1.2.3
$ y=`echo $x | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )`
$ echo $y
1.2.4
Awk делает это довольно просто:
echo "1.2.14" | awk -F \. {'print $1,$2, $3'}
распечатает 1 2 14.
флаг -F указывает разделитель.
Если вы хотите сохранить одно из значений:
firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})
Небольшое отклонение от решения fgm с помощью встроенной команды read
для разделения строки на массив. Обратите внимание, что область действия переменной IFS
ограничена командой read
(поэтому нет необходимости хранить и восстанавливать текущую переменную IFS
).
version='1.2.33'
IFS='.' read -r -a a <<<"$version"
((a[2]++))
printf '%s\n' "${a[@]}" | nl
version="${a[0]}.${a[1]}.${a[2]}"
echo "$version"
Вдохновленный ответом jlliagre, я сделал свою собственную версию , которая поддерживает номера версий, имеющие только большую версию. Версия jlliagre сделает 1 → 1.2 вместо 2.
Этот параметр подходит для обоих стилей номеров версий:
function increment_version()
local VERSION="$1"
local INCREMENTED_VERSION=
if [[ "$VERSION" =~ .*\..* ]]; then
INCREMENTED_VERSION="${VERSION%.*}.$((${VERSION##*.}+1))"
else
INCREMENTED_VERSION="$((${VERSION##*.}+1))"
fi
echo "$INCREMENTED_VERSION"
}
Это приведет к следующим выходам:
increment_version 1 -> 2
increment_version 1.2 -> 1.3
increment_version 1.2.9 -> 1.2.10
increment_version 1.2.9.101 -> 1.2.9.102