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
には整数が必要です。では、バージョンを比較する他の方法はありますか?
それが美しいかどうかはわかりませんが、私が知っているすべてのバージョン形式で機能しています。
#!/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 5.0.0"
else
echo "Less than 5.0.0"
fi
(注:ユーザー「ワイルドカード」によるより良いバージョン: https://unix.stackexchange.com/users/135943/wildcard 、追加条件を削除)
ここでは、Unixカーネルのバージョンを比較するためのソリューションを示します。そして、それはgccのような他のもののために働くべきです。私は最初の2つのバージョン番号のみを気にしますが、別のロジック層を追加できます。ライナーは1本ですので、わかりやすいように複数行で書きました。
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のバージョンチェックに使用できます。
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: <
クレジットは @ Shellman に送られます
短いバージョン:
version_greater_equal()
{
printf '%s\n%s\n' "$2" "$1" | sort -V -C
}
version_greater_equal "${gcc_version}" 8.2 || die "need 8.2 or above"
私たちは、GNU makefileで多くのバージョンチェックを行っていました。makefile機能を使用してシェルを作成しました。古いBinutilsとバグのあるコンパイラを検出し、その場で回避する必要がありました。
使用したパターンは次のとおりです。
#!/usr/bin/env bash
CC=$(command -v gcc)
GREP=$(command -v grep)
# Fixup CC and GREP as needed. It may be needed on AIX, BSDs, and Solaris
if [[ -f "/usr/gnu/bin/grep" ]]; then
GREP="/usr/gnu/bin/grep"
Elif [[ -f "/usr/linux/bin/grep" ]]; then
GREP="/usr/linux/bin/grep"
Elif [[ -f "/usr/xpg4/bin/grep" ]]; then
GREP="/usr/xpg4/bin/grep"
fi
# Check compiler for GCC 4.8 or later
GCC48_OR_LATER=$("$CXX" -v 2>&1 | "$GREP" -i -c -E "gcc version (4\.[8-9]|[5-9]\.)")
if [[ "$GCC48_OR_LATER" -ne 0 ]];
then
...
fi
# Check assembler for GAS 2.19 or later
GAS219_OR_LATER=$("$CXX" -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | "$GREP" -c -E "GNU assembler version (2\.19|2\.[2-9]|[3-9])")
if [[ "$GAS219_OR_LATER" -ne 0 ]];
then
...
fi