Bash - 정수 표현이 필요합니다

Bash - 정수 표현이 필요합니다

내 테마의 업데이트 스크립트를 확인하고 있습니다.

2개의 텍스트 파일이 있습니다. 첫 번째 파일은 "current.txt"이며 현재 버전을 포함합니다. 4.1.1이 텍스트 파일에는 문자열이 있습니다.

두 번째 파일은 "latest.txt"이며 최신 버전이 포함되어 있습니다. 4.2이 텍스트 파일에는 문자열이 있습니다.

코드는 다음과 같습니다.

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

즉, current.txt가 최신.txt와 다른 경우 "버전 4.2로 업데이트됨"이라고 표시됩니다. 그렇지 않은 경우 "버전 4.1.1이 최신 버전입니다"라고 표시됩니다.

하지만 실행하려고 하면. 이 오류가 발생합니다.

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

그럼 내가 뭘 잘못하고 있는 걸까요?

답변1

이것test라고도 하는 명령에는 [문자열 비교와 정수 비교를 위한 별도의 연산자가 있습니다.

정수 1 -eq 정수 2

INTEGER1은 INTEGER2와 같습니다.

그리고

문자열1 = 문자열2

문자열 평등

그리고

문자열 1 != 문자열 2

문자열이 동일하지 않습니다.

데이터가 엄밀히 말하면 정수가 아니기 때문에 테스트에서는 문자열 비교 연산자를 사용해야 합니다. 주석의 마지막 깨달음은 "-eq" 논리가 echoif/else 문의 의미와 일치하지 않으므로 새 코드 조각은 다음과 같아야 한다는 것입니다.

...
if [ "$x" != "$y" ]
then
       echo There is version $y update
else
       echo Version $x is the latest version
fi

답변2

그런데 두 개의 버전 문자열(예: in $x및 )이 있는 경우 및 GNU를 사용하여 어떤 버전이 더 최신인지 찾을 $y수 있습니다.printfsort

$ 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

관련 정보