# [bash] Rechnen mit Versionsnummern?

## 3PO

Hallo Zusammen,

Ich habe da ein kleines Problem und stehe da wohl wieder mal auf dem Schlauch...   :Confused: 

Ich möchte in einem Shellscript eine Bedingung einbauen, die sich z.B. auf die Kernelversion bezieht, in etwa so:

```
if [ $KERNELVERSION -le 3.9.9 ] ; then

 foo

.....
```

Allerdings habe ich keine Idee, wie ich das mit den Subversionen regeln kann?

Mein erster Gedanke war, die Punkte zu ignorieren, aber dann wäre z.B. ja 3.8.22 neuer (größer) als 3.12.0.

Hat Jemand eine Idee, wie man das lösen könnte?

----------

## franzf

An den Punkten zerlegen und dann major, minor, bugfix-Version vergleichen.

----------

## l3u

Ich würd das so machen:

```
#!/bin/bash

version="3.10.17"

condVersion="3.11.17"

versionArray=($(echo "$version" | tr "." " "))

condVersionArray=($(echo "$condVersion" | tr "." " "))

state="eq"

for i in $(seq ${#condVersionArray[@]}); do

   

   i=$((i - 1))

   if [[ ${versionArray[i]} -lt ${condVersionArray[i]} ]]; then

      state="lt"

      break

   fi

   if [[ ${versionArray[i]} -gt ${condVersionArray[i]} ]]; then

      state="gt"

      break

   fi

done

echo "$version $state $condVersion"
```

Halt in ne Funktion packen und dann das Ergebnis auswerten in der eigentliche if-Anweisung. Keine Ahnung, ob das mit einer anderen Shell als der Bash geht, aber Bash kann’s … berücksichtigt natürlich im Moment keine "-r1" hinten dran. Müsst man halt entsprechend noch verarbeiten.

----------

## 3PO

An diesen Thread habe schon gar nicht mehr gedacht.   :Laughing: 

Ich habe es so gelöst:   :Wink: 

```
MIN_VERSION=31200

A=$(uname -r)

RELEASE=${A%%\.*}

A=${A#*\.}

MAJOR=${A%%\.*}

A=${A#*\.}

MINOR=${A%%\-*}

if [ $((RELEASE*10000 + MAJOR*100 + MINOR)) -le $MIN_VERSION ] ; then 

 MYPARMS="1"

else

 MYPARMS="0"

fi
```

----------

## l3u

Oder so.

----------

## sirro

Weitere Moeglichkeiten:

http://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format

Da gibt es eine laengliche Funktion, die vieles beruecksichtigt und eine die sich recht simpel auf "sort -V" verlaesst.

```
verlte() {

    [  "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ]

}
```

----------

## mv

Solange die Kernel-Version der Gentoo-Konvention folgt (also wenn Du keine künstlichen Anhänge wie -hardened hast), kannst Du auch versionsort von eix benutzen, das keine Einschränkung an maximal  zweistellige Minor-Versionen hat 

```
VERSION=1.1.3000

case `versionsort 1.13.0 "x-$VERSION"` in 1.13.0'

'*) echo "$VERSION ist älter als 1.13.0";;

*) echo "$VERSION ist jünger als 1.13.0";;

esac
```

----------

