dmouawad
dmouawad

Reputation: 589

How to update minor version number in bash?

Currently, I want to update the minor version in a text file using a bash command. This is the format I am dealing with: MAJOR.Minor.BugFix. I am able to increment the BugFix version number but have been unable to increment just the minor version.

I.e

01.01.00-> 01.02.00
01.99.00-> 02.00.00

This is the code snippet I found online and was trying to tweak to update the minor instead of the bug fix

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}'

Upvotes: 0

Views: 2207

Answers (4)

wjandrea
wjandrea

Reputation: 33107

You don't need AWK for this, just read with IFS=. will do.

Though in Bash, leading zeroes indicate octal so you'll need to guard against them.

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 run:

$ ./test.sh 01.01.00
01.02.00
$ ./test.sh 01.99.09
02.00.09
$ ./test.sh 1.1.1
01.02.01

Upvotes: 2

David C. Rankin
David C. Rankin

Reputation: 84579

awk provides a simple and efficient way to handle updating the minor-version (and increment the major-version if the minor version is 99 and setting the minor-version zero), e.g.

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

Above the leading-zeros are are ignored when considered as a number and then it is just a simple comparison of the minor-version to determine whether to increment the major-version and zero the minor-version or simply increment the minor-version. The printf is used to provide the formatted output:

Example Use/Output

With your data in the file minorver, you can do:

$ 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

Let me know if you have further questions.

Upvotes: 0

Gilbert
Gilbert

Reputation: 3776

As -F takes a regular expression -F. will match any character. Do something like -F"[.]" to make it match periods and you can just split fields without any of the length() stuff.

larsks idea of splitting into multiple lines is a good one:

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 );
    }'

Upvotes: 3

wcarhart
wcarhart

Reputation: 2783

Quick answer:

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

Full explanation:

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"

Upvotes: 1

Related Questions