Как обновить младший номер версии в bash? - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я хочу обновить вспомогательную версию в текстовом файле с помощью команды bash. Это формат, с которым я имею дело: MAJOR.Minor.BugFix. Я могу увеличить номер версии BugFix, но не смог увеличить только вспомогательную версию.

Т.е.

01.01.00-> 01.02.00
01.99.00-> 02.00.00

Это фрагмент кода, который я нашел в Интернете и пытался настроить на обновить минор вместо исправления ошибки

echo 01.00.1 | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{if(length($NF+1)>length($NF))$(NF-1)++; $NF=sprintf("%0*d", length($NF), ($NF+1)%(10^length($NF))); print}'

Ответы [ 4 ]

3 голосов
/ 28 января 2020

Поскольку -F принимает регулярное выражение, -F. будет соответствовать любому символу. Сделайте что-то вроде -F"[.]", чтобы оно совпадало с периодами, и вы можете просто разделить поля без всякой вещи length () .

larsks идея разбить на несколько строки хорошие:

echo $a | awk -F'[.]'  '{
    major=$1;
    minor=$2;
    patch=$3;
    minor += 1;
    major += minor / 100;
    minor = minor % 100;
    printf( "%02d.%02d.%02d\n", major, minor, patch );
    }'
2 голосов
/ 28 января 2020

Вам не нужен AWK для этого, просто read с IFS=. подойдет.

Хотя в Bash, ведущие нули обозначают восьмеричные, поэтому вам нужно быть осторожными против них.

IFS=. read -r major minor bugfix <<< "$1"

# Specify base 10 in case of leading zeroes (octal)
((major=10#$major, minor=10#$minor, bugfix=10#$bugfix))

if [[ $minor -eq 99 ]]; then
    ((major++, minor=0))
else
    ((minor++))
fi

printf '%02d.%02d.%02d\n' "$major" "$minor" "$bugfix"

Тестовый прогон:

$ ./test.sh 01.01.00
01.02.00
$ ./test.sh 01.99.09
02.00.09
$ ./test.sh 1.1.1
01.02.01
1 голос
/ 28 января 2020

Быстрый ответ:

version=01.02.00
newversion="$(printf "%06d" "$(expr "$(echo $version | sed 's/\.//g')" + 100)")"
echo "${newversion:0:2}.${newversion:2:2}.${newversion:4:2}"

Полное объяснение:

version=01.02.00

# get the number without decimals
rawnumber="$(echo $version | sed 's/\.//g')"

# add 100 to number (to increment minor version)
sum="$(expr "$rawnumber" + 100)"

# make number 6 digits
newnumber="$(printf "%06d" "$sum")"

# add decimals back to number
newversion="${newnumber:0:2}.${newnumber:2:2}.${newnumber:4:2}"
echo "$newversion"
0 голосов
/ 28 января 2020

awk предоставляет простой и эффективный способ обработки обновления минорной версии (и увеличения основной версии, если минорной версии равен 99, и установки нулевой минорной версии), например,

awk -F'.' '{
    if ($2 == 99) {
        $1++
        $2=0
    }
    else
        $2++
    printf "%02d.%02d.%02d\n", $1, $2 ,$3
}' minorver

Над начальными нулями игнорируются, когда они рассматриваются как число, и тогда это просто простое сравнение minor-version , чтобы определить, следует ли увеличить major-version и обнулите minor-version или просто увеличьте minor-version . printf используется для предоставления форматированного вывода:

Пример использования / Вывод

С вашими данными в файле minorver вы можете сделать:

$ awk -F'.' '{
>     if ($2 == 99) {
>         $1++
>         $2=0
>     }
>     else
>         $2++
>     printf "%02d.%02d.%02d\n", $1, $2 ,$3
> }' minorver
01.02.00
02.00.00

Дайте мне знать, если у вас есть дополнительные вопросы.

...