Como posso determinar a versão mais recente em URL?

1

Estou tentando colocar uma "função" dentro de um script para instalar a versão mais recente do "TeamSpeak3" Client e fazer todas as configurações.

Meu problema é que eu não sei como fazer uma função para testar a parte do número da versão, " número . número . número . número ". Os números variam de 0 a 99.

Por exemplo, eu recebo uma variável que tem o valor em uma URL:

URL=http://dl.4players.de/ts/releases/$version/TeamSpeak3-Client-linux_$arch-$version.run

Aqui a variável, $ Version, a última é 3.0.16. O último URL atual é:

http://dl.4players.de/ts/releases/3.0.16/TeamSpeak3-Client-linux_x86-3.0.16.run

Mas, no futuro, quando eu usar o script, quero que ele determine automaticamente a versão mais recente, verificando os números dentro da URL.

Para "archs", tenho este código:

# Determining the system arch
arch=$(uname -m)
case "$arch" in
x86)    arch="x86"  ;;
i?86)   arch="x86"  ;;
amd64)  arch="amd64"    ;;
x86_64) arch="x86_64"   ;;
* ) echo "Your Arch '$arch' -> Its not supported."  ;;
esac

Talvez uma matriz ou algo parecido? Alguém pode me ajudar com essa ideia?

    
por inukaze 28.11.2014 / 03:07

4 respostas

1

Eu não sei exatamente o que você está perguntando. Supondo que você queira encontrar a última versão listada no link , você pode fazer isso:

curl -s http://dl.4players.de/ts/releases/ | \
  grep -Po '(?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/")' | \
  sort -Vr | head -1

Exemplo de saída:

3.0.16

Explicação:

  • Note que o diretório listando HTML segue um padrão razoavelmente regular :

    <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="3.0.0/">3.0.0/</a></td><td align="right">10-Aug-2011 16:57  </td><td align="right">  - </td><td>&nbsp;</td></tr>
    <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="3.0.1/">3.0.1/</a></td><td align="right">17-Nov-2011 08:43  </td><td align="right">  - </td><td>&nbsp;</td></tr>
    

    Todos os links da pasta de versão são criados com href="X.Y.Z[.A]/" , A , X , Y e Z sendo números.

  • Portanto, podemos grep para este padrão: (?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/") . Eu usei regexes Perl ( -P ) para lookaheads e lookbehinds (para que a string seja envolvida por href=" e /" , mas esses dois não fazem parte da correspondência real). O regex [0-9]+(\.[0-9]+){2,3} significa:

    1. Um ou mais dígitos: [0-9]+ , seguido por
    2. Um grupo que consiste em um período e um ou mais dígitos ( (\.[0-9]+) ), repetidos duas ou três vezes ( {2,3} ).
  • Em seguida, fazemos a versão sort e obtemos o resultado principal.

Ordinariamente, não se deve usar expressões regulares para analisar HTML . No entanto, acho que de vez em quando uma exceção pode ser feita.

    
por 28.11.2014 / 03:52
2

É por isso que você não deve usar script de shell puro. Em vez disso, é melhor usar algo que é destinado à tarefa , como o uscan (que é um script perl), em vez de fazê-lo sozinho:

$ uscan --watchfile teamspeak --package TeamSpeak3 --no-download --verbose --upstream-version 3.0.16
-- In test, processing watchfile line:
   http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_amd64-([\d\.]+).run
-- Found the following matching hrefs:
     TeamSpeak3-Client-linux_amd64-3.0.16.run (3.0.16)
Newest version on remote site is 3.0.16, local version is 3.0.16
 => Package is up to date

o conteúdo do arquivo teamspeak é:

version=2
http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_amd64-([\d\.]+).run

No exemplo acima, estou definindo manualmente a versão da última versão, se você quiser, pode substituir a versão do TeamSpeak se eles suportarem o parâmetro --version , por exemplo:

$ uscan --watchfile teamspeak --package TeamSpeak3 --no-download --verbose --upstream-version $(teamspeak --version)

deve gerar um valor numérico. Também é possível fazer o download automagicamente do arquivo de execução mais recente, basta remover a opção --no-download . Isso tem a vantagem de ser muito, muito flexível, você não precisa modificar nada quando uma nova versão sai, nem se preocupar com isso.

A única limitação real para o seu caso de uso é que o uscan não suporta arquiteturas de configuração, mas tal limitação é trivialmente superada se você simplesmente criar outro arquivo, digamos teamspeak-i386, e ajustar a URL assim:

version=2
http://dl.4players.de/ts/releases/([\d\.]+)/TeamSpeak3-Client-linux_x86-([\d\.]+).run
    
por 28.11.2014 / 04:12
0

Eu pegaria os URLs e analisaria o número da versão dele:

$ echo 'http://dl.4players.de/ts/releases/3.0.16/TeamSpeak3-Client-linux_x86-3.0.16.run' \
    | awk -F'_x86-' '{print $2}' | sed 's/.run//'
3.0.16

Com a versão analisada, você pode usar sort para determinar qual versão é mais recente. Especificamente com sort , usando sua opção -V , quais versões mais recentes têm.

$ echo -e '3.0.16\n4.0.2\n1.2.3\n5.6.7\n3.0.17' | sort -V | tail -1
5.6.7

Esta é apenas uma abordagem aproximada, mas deve mostrar como você pode facilmente alcançar o que está procurando.

NOTA: Minha sort versão.

$ sort --version
sort (GNU coreutils) 8.21
    
por 28.11.2014 / 03:40
0

bem com o curl eu posso resolver a versão mais recente do Quake2

Q2VA=$(curl -s http://deponie.yamagi.org/quake2/ | grep -Po "quake2-[0-9].[0-9][0-9].tar.xz" | sort -Vr | head -1)

Mas agora eu estou tentando usar o LibreOffice, usando o seguinte comando:

curl -s http://www.libreoffice.org/download/download/ | grep -Po "[0-9].[0-9].[0-9]" | sort -Vr

Saída:

93276
90701
89681
72663
50227
43905
42382
42382
26302
25220
20474
18000
14907
14764
14001
13964
13903
13902
13898
13890
13884
12887
12774
07992
700,9
100,3
6/5.4
6/5.3
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.4.0
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.5
5.3.4
5.3.4
5.2.7
5.2.7
2.6.2
1.1.0
0,400
0,300
0A500
0A500

Como eu posso indicar apenas o primeiro tipo de vale "Number.Number.Number" para armazenar em uma variável? neste caso 5.4.0 o primeiro, na linha 29, mas se eu usar algum como sed, isso pode mudar no futuro, não é seguro nunca a linha 29 já teve a versão mais recente.

Saída do desejo:

5.4.0

Alguém pode dar uma ideia para resolvê-lo?

    
por 06.08.2017 / 16:42