Bash - Expressão inteira esperada

5

Estou fazendo a verificação do script de atualização do meu tema

Eu tenho 2 arquivos de texto. O primeiro é chamado "current.txt" e contém a versão atual. Há 4.1.1 string nesse arquivo de texto.

O segundo é chamado "latest.txt" e contém a versão mais recente. Há 4.2 string neste arquivo de texto.

Então aqui está o código

echo "Checking update";
x=$(cat ./current.txt)
y=$(cat ./latest.txt)
if [ "$x" -eq "$y" ]
then
       echo There is version $y update
else
       echo Version $x is the latest version
fi

O que isso significa é que current.txt não é o mesmo que o último.txt, então ele diz "há atualização da versão 4.2". Se não, ele dirá que "a versão 4.1.1 é a versão mais recente"

Mas quando eu tento executá-lo. Eu recebo este erro

Checking update
./test.sh: line 4: [: 4.1.1: integer expression expected
Version 4.1.1 is the latest version

Então, o que estou fazendo de errado com isso?

    
por superquanganh 02.07.2016 / 21:33

2 respostas

6

O comando test , também chamado [ , tem operadores separados para comparações de strings e comparações de inteiros :

INTEGER1 -eq INTEGER2

INTEGER1 is equal to INTEGER2

vs

STRING1 = STRING2

the strings are equal

e

STRING1 != STRING2

the strings are not equal

Como seus dados não são estritamente um inteiro, seu teste precisa usar o operador de comparação de strings. A última realização nos comentários foi que a lógica "-eq" não correspondia ao sentido das instruções if / else echo , portanto, o novo snippet deveria ser:

...
if [ "$x" != "$y" ]
then
       echo There is version $y update
else
       echo Version $x is the latest version
fi
    
por 03.07.2016 / 02:30
1

BTW, se você tiver duas sequências de versão (por exemplo, em $x e $y ), poderá usar printf e GNU sort para descobrir qual é a mais nova.

$ x=4.1.1
$ y=4.2.2
$ printf "%s\n" "$x" "$y" | sort -V -r
4.2.2
4.1.1

$ if [ $(printf "%s\n" "$x" "$y" | sort -V -r | head -1) = "$x" ] ; then
  if [ "$x" = "$y" ] ; then
    echo "$x is equal to $y"
  else
    echo "$x is newer than $y"
  fi
else
  echo "$x is older than $y"
fi
4.1.1 is older than 4.2.2
    
por 03.07.2016 / 17:31