URL의 최신 버전을 확인하는 방법은 무엇입니까?

URL의 최신 버전을 확인하는 방법은 무엇입니까?

"TeamSpeak3" 클라이언트의 최신 버전을 설치하고 모든 것을 구성하기 위해 스크립트에 "함수"를 넣으려고 합니다.

내 문제는 버전 번호 부분을 테스트하는 함수를 만드는 방법을 모른다는 것입니다."숫자.숫자.숫자.숫자". 숫자 범위는 0부터 99까지입니다.

예를 들어, URL의 값이 포함된 변수를 얻습니다.

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

여기서 $Version 변수는 최신 버전이 3.0.16입니다. 최신 웹사이트 주소는 다음과 같습니다.

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

하지만 앞으로 이 스크립트를 사용할 때 URL의 번호를 확인하여 자동으로 최신 버전을 결정하고 싶습니다.

"아치"의 경우 다음 코드가 있습니다.

# 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

어쩌면 배열이나 이와 유사한 것일 수도 있습니다. 이 아이디어를 구현하는 데 도움을 줄 수 있는 사람이 있나요?

답변1

이것이 순수 쉘 스크립트를 사용해서는 안되는 이유입니다. 대신 뭔가를 사용하는 것이 더 좋습니다임무를 위한 거야, uscan(perl 스크립트)처럼 직접 수행하는 대신 다음을 수행합니다.

$ 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

Teampeak 파일의 내용은 다음과 같습니다.

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

위의 예에서는 최신 버전의 버전을 수동으로 설정했습니다. 원하는 경우 --version매개변수를 지원하는 TeamSpeak의 버전을 바꿀 수 있습니다. 즉:

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

숫자 값을 출력해야 합니다. 최신 실행 파일을 자동으로 다운로드하는 것도 가능합니다 --no-download. 옵션 을 제거하기만 하면 됩니다. 이것의 장점은 매우 유연하고 새 버전이 출시될 때 아무것도 수정할 필요가 없으며 버전이 손상될 것을 걱정할 필요가 없다는 것입니다.

사용 사례의 유일한 실제 제한은 uscan이 스키마 설정을 지원하지 않는다는 것입니다. 그러나 다른 파일(예: teampeak-i386)을 만들고 다음과 같이 URL을 조정하면 이 제한을 쉽게 극복할 수 있습니다.

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

답변2

정확히 무엇을 요구하시는지 잘 모르겠습니다. 나열된 최신 버전을 찾고 싶다고 가정해 보겠습니다.http://dl.4players.de/ts/releases/, 다음과 같이 할 수 있습니다.

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

출력 예:

3.0.16

설명하다:

  • 디렉토리 목록 HTML은 다음과 같습니다.정기적인무늬:

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

    href="X.Y.Z[.A]/"모든 버전 폴더 링크 는 , , A및 숫자 로 생성됩니다 .XYZ

  • 그래서 우리는 grep이 패턴에 대해 할 수 있습니다 (?<=href=")[0-9]+(\.[0-9]+){2,3}(?=/"): 저는 Perl 정규식을 사용합니다( -P).앞을 보고 뒤를 돌아보세요(따라서 문자열은 href="and 로 둘러싸여 있지만 /"이 두 개는 실제 일치 항목의 일부가 아닙니다.) 정규식의 [0-9]+(\.[0-9]+){2,3}의미는 다음과 같습니다.

    1. 하나 이상의 숫자: [0-9]+, 그 뒤에,
    2. 마침표와 하나 이상의 숫자로 구성된 그룹( ) (\.[0-9]+), 두세 번 반복됨( {2,3}).
  • 그런 다음 버전을 만들고 sort최상의 결과를 얻습니다.


일반적으로 HTML을 구문 분석하는 데 정규식을 사용하면 안 됩니다.그러나 때로는 예외가 있을 수 있다고 생각합니다.

답변3

URL을 가져와서 버전 번호를 구문 분석하겠습니다.

$ 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

버전이 구문 분석되면 이를 사용하여 sort어떤 버전이 최신인지 확인할 수 있습니다. 특히 sort그것을 사용하는 스위치 -V에는 최신 버전이 있습니다.

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

이는 대략적인 접근 방식이지만 원하는 것을 쉽게 달성하는 방법을 보여줍니다.

노트:sort버전.

$ sort --version
sort (GNU coreutils) 8.21

답변4

컬을 사용하면 매우 좋습니다. Quake2 최신 버전을 해결할 수 있습니다.

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

하지만 이제 다음 명령을 사용하여 LibreOffice를 사용하려고 합니다.

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

산출:

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

변수에 저장된 첫 번째 값만 "Number.Number.Number" 유형임을 어떻게 표시합니까? 이 경우 첫 번째는 29행의 5.4.0이지만 sed와 같은 것을 사용하면 나중에 변경될 수 있으며 29행은 최신 버전을 사용하는 것이 안전하지 않습니다.

예상 출력:

5.4.0

누구든지 몇 가지 솔루션을 제공할 수 있습니까?

관련 정보