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

Если у вас есть дубликаты фамилий, вы можете отсортировать их по имени -

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});
29
задан Dougnukem 5 June 2011 в 19:25
поделиться

8 ответов

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

$ v=11.1.2.3.0
$ echo "${v%.*}.$((${v##*.}+1))"
11.1.2.3.1

Вот как это работает:

Строка разбита на две части.

  • первый содержит все, кроме последней точки и следующих символов: ${v%.*}
  • второй содержит все, кроме всех символов до последней точки: ${v##*.}

Первая часть печатается как есть, за ней следует простая точка, а последняя часть увеличивается с использованием арифметического расширения оболочки: $((x+1))

47
ответ дан jlliagre 5 June 2011 в 19:25
поделиться

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

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"

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

16
ответ дан Eedoh 5 June 2011 в 19:25
поделиться

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
32
ответ дан Fritz G. Mehner 5 June 2011 в 19:25
поделиться

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

$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4

Итак, мы можем сделать:

7
ответ дан Chris J 5 June 2011 в 19:25
поделиться

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

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

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

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

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

6
ответ дан geekosaur 5 June 2011 в 19:25
поделиться

Вдохновленный ответом 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
1
ответ дан Community 5 June 2011 в 19:25
поделиться

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

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

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

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

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

4
ответ дан bbaja42 5 June 2011 в 19:25
поделиться

Небольшая вариация решения 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?

0
ответ дан Community 5 June 2011 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: