Подтвердить что ты не робот

Извлечь номер версии из файла в оболочке script

Я пытаюсь написать bash script, который увеличивает номер версии, указанный в

{major}.{minor}.{revision}

Например.

1.2.13

Есть ли хороший способ легко извлечь эти 3 числа, используя что-то вроде sed или awk, чтобы я мог увеличивать число {ревизия} и выводить полную строку номера версии.

4b9b3361

Ответ 1

$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14

Ответ 2

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

Ответ 3

Я предпочитаю команду "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"

Я знаю, что это не самый короткий путь, но для меня это проще всего понять и прочитать...

Ответ 4

Я использую собственное разделение слова оболочки; что-то вроде

oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"

хотя вам нужно быть осторожным с номерами версий в целом из-за буквенных или суточных дат и других досадных несогласованных битов. После этого позиционные параметры будут установлены на компоненты $version:

$1 = 1
$2 = 2
$3 = 13

($IFS - это набор одиночных символов, а не строка, поэтому это не будет работать с разделителем полей нескольких символов, хотя вы можете использовать IFS=.- для разделения на . или -.)

Ответ 5

Еще один способ оболочки (показывающий всегда больше, чем один способ обманывать этот материал...):

$ 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

Ответ 6

Awk делает это довольно просто:

echo "1.2.14" | awk -F \. {'print $1,$2, $3'} распечатает 1 2 14.

флаг -F указывает разделитель.

Если вы хотите сохранить одно из значений:

firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})

Ответ 7

Небольшое отклонение от решения 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"

Смотрите: Как разбить строку на разделителе в Bash?

Ответ 8

Вдохновленный ответом 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