gcc
시스템에 최소 버전이 설치되어 있는지 확인하기 위해 버전을 비교하고 싶다고 가정해 보겠습니다 .
버전을 확인하기 위해 gcc
다음 명령을 실행했습니다.
gcc --version | head -n1 | cut -d" " -f4
출력은 다음과 같습니다
4.8.5
그래서 if
이 버전을 다른 값으로 확인하기 위해 간단한 문장을 작성했습니다.
if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then
echo "Less than 5.0.0"
else
echo "Greater than 5.0.0"
fi
하지만 오류가 발생합니다.
[: integer expression expected: 4.8.5
내 실수는 비교를 위해 문자열을 사용하고 -lt
정수를 필요로 한다는 점을 이해합니다. 그렇다면 버전을 비교할 수 있는 다른 방법이 있나요?
답변1
예쁜지는 모르겠지만 제가 아는 모든 버전 형식에서 작동합니다.
#!/bin/bash
currentver="$(gcc -dumpversion)"
requiredver="5.0.0"
if [ "$(printf '%s\n' "$requiredver" "$currentver" | sort -V | head -n1)" = "$requiredver" ]; then
echo "Greater than or equal to ${requiredver}"
else
echo "Less than ${requiredver}"
fi
(노트:사용자 "와일드카드"의 더 나은 버전:https://unix.stackexchange.com/users/135943/wildcard, 추가 조건 제거)
답변2
GNU를 가정하면 더 짧은 버전입니다 sort
.
version_greater_equal()
{
printf '%s\n%s\n' "$2" "$1" | sort --check=quiet --version-sort
}
version_greater_equal "${gcc_version}" 8.2 || die "need 8.2 or above"
gcc_version=008.002
와 동일하게 주문하더라도 불만족으로 보고되므로 주의하세요 8.2
. 에 / 옵션을 추가하면 -s
이 문제를 완화할 수 있습니다 .--stable
sort
답변3
여기서는 Unix 커널 버전을 비교하는 솔루션을 제공합니다. gcc와 같은 다른 사람들에게도 작동해야 합니다. 처음 2개의 버전 번호에만 관심이 있지만 다른 논리 레이어를 추가할 수 있습니다. 한 줄인데, 이해하기 쉽도록 여러 줄로 작성하겠습니다.
check_linux_version() {
version_good=$(uname -r | awk 'BEGIN{ FS="."};
{ if ($1 < 4) { print "N"; }
else if ($1 == 4) {
if ($2 < 4) { print "N"; }
else { print "Y"; }
}
else { print "Y"; }
}')
#if [ "$current" \< "$expected" ]; then
if [ "$version_good" = "N" ]; then
current=$(uname -r)
echo current linux version too low
echo current Linux: $current
echo required 4.4 minimum
return 1
fi
}
이를 수정하여 gcc 버전 확인에 사용할 수 있습니다.
답변4
function version_compare () {
function sub_ver () {
local len=${#1}
temp=${1%%"."*} && indexOf=`echo ${1%%"."*} | echo ${#temp}`
echo -e "${1:0:indexOf}"
}
function cut_dot () {
local offset=${#1}
local length=${#2}
echo -e "${2:((++offset)):length}"
}
if [ -z "$1" ] || [ -z "$2" ]; then
echo "=" && exit 0
fi
local v1=`echo -e "${1}" | tr -d '[[:space:]]'`
local v2=`echo -e "${2}" | tr -d '[[:space:]]'`
local v1_sub=`sub_ver $v1`
local v2_sub=`sub_ver $v2`
if (( v1_sub > v2_sub )); then
echo ">"
elif (( v1_sub < v2_sub )); then
echo "<"
else
version_compare `cut_dot $v1_sub $v1` `cut_dot $v2_sub $v2`
fi
}
### Usage:
version_compare "1.2.3" "1.2.4"
# Output: <
신용은 간다@셔먼