내 테마의 업데이트 스크립트를 확인하고 있습니다.
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" 논리가 echo
if/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
수 있습니다.printf
sort
$ 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