4 votos

Comparar varios dígitos de los números de versión de bash

Tratando de escribir un guión que busca la versión de la Aplicación, a continuación, devuelve el valor. Mi problema es que el valor es de tres a cuatro intergers largo (ejemplo 4.3.2).

He estado buscando un rato y no se puede encontrar ningún sintaxis que permite el uso de un != o -ge para algo más que un número de períodos en ella. Sólo me preguntaba si alguien tiene una mejor manera o me limitaré a seguir sumando, para cada versión.

Lo que quiero

else if [ $version1 -ge "9.0.8" ]; then

Cómo se escribe ahora

vercheck=`mdls -name kMDItemVersion /Applications/iMovie.app`
version=`echo ${vercheck:17}`
version1=`echo ${version:1:5}`

[...]

else if [ $version1 = "9.0.8" ]; [ $version1 = "9.1.1" ]; then
    echo "You already have this version or a higher version installed"
    exit 0

2voto

moodforaday Puntos 2633

Creo que me he adaptado ligeramente de este http://bashscripts.org/forum/viewtopic.php?f=16&t=1248. Me gusta porque es bastante compacto y legible.

Esto es opcional pero deseable de la OMI:

if [ "$#" != "2" ]
then
    echo "$0 requires exactly two arguments."
    exit 2
fi

Aquí está la carne:

Yo siempre uso $1 "la versión instalada localmente" y $2 "la versión que me estoy comparando contra" de modo que si esto me deja con $? = 1 necesito actualizar, de lo contrario yo estoy arriba-a-fecha (o incluso antes):

function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }

if [ $(version $1) -gt $(version $2) ]; then
    echo "$1 is newer than $2"
    exit 0
elif [ $(version $1) -lt $(version $2) ]; then
    echo "$1 is older than $2"
    exit 1
else
    echo "$1 is identical to $2"
    exit 0
fi

Si todo lo que importaba era si $1 era hasta la fecha (es decir, igual o mayor que $2) podría hacer aún más sencillo:

if [ $(version $1) -ge $(version $2) ]; then
    echo "No Newer Version Available"
    exit 0
fi

Cualquier código de abajo que solo se ejecutará si hay una nueva versión disponible. De lo contrario el script va a salir limpiamente en ese punto.

p.s.: Puedo hacer esto en /bin/zsh no /bin/bash pero yo no creo que eso hace la diferencia en este caso.

0voto

Ryan Spears Puntos 1524

En realidad, la comparación de los números de versión es bastante sencillo (al menos mientras sean estrictamente numérico) como están estructurados jerárquicamente de izquierda a derecha. Secuencial de comparación en ese mismo orden producirá un resultado claro.

El siguiente bash función devolverá 0 (verdadero) si dos números de versión no es igual, 1 (falso) si, siempre y cuando las variables $version_1 y $version_2 contienen sólo un número arbitrario de grupos de dígitos separados por puntos:

function versions_not_equal {
    while [[ $version_1 != "0" || $version_2 != "0" ]]; do
        (( ${version_1%%.*} != ${version_2%%.*} )) && return 0
        [[ ${version_1} =~ "." ]] && version_1="${version_1#*.}" || version_1=0
        [[ ${version_2} =~ "." ]] && version_2="${version_2#*.}" || version_2=0
    done
    false
}

La implementación de otras comparaciones, como la mayor o igual, es tan simple como cambiar el operador de comparación de la media aritmética de la evaluación (es decir, (( ${version_1%%.*} >= "${version_2%%.*}" ))).

0voto

Te puedo dar un largo ejemplo de "si la versión comprobada es entre min y max", y se puede optimizar para tus necesidades cambiantes de la cabeza -1/tail -1 y corte de 1 variable:

min_ver="a-1.1.1"
max_ver="a-9.1.1"
check_ver="a-2.2.9"
if [ "$( echo -e "${min_ver}\\n${max_ver}\\n${check_ver}" | sort --sort=version | head -2 | tail -1)" == ${check_ver} ]
then
  echo YES - apply  ${check_ver}
fi

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X