Como comparar a versão de um programa em um script de shell?

5

Suponha que eu queira comparar gcc version para ver se o sistema tem a versão mínima instalada ou não.

Para verificar a versão gcc , executei o seguinte

gcc --version | head -n1 | cut -d" " -f4

A saída foi

4.8.5

Então, eu escrevi uma declaração if simples para verificar essa versão com algum outro valor

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

Mas isso gera um erro:

[: integer expression expected: 4.8.5

Eu entendi meu erro que estava usando strings para comparar e o -lt requer inteiro. Então, existe alguma outra maneira de comparar as versões?

    
por Abhimanyu Saharan 27.05.2016 / 16:01

3 respostas

12

Não sei se é bonito, mas funciona para todos os formatos de versão que conheço.

#!/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

( Observação: melhor versão do curinga "usuário": link , removido condição adicional)

    
por 27.05.2016 / 16:27
1

Aqui eu dou uma solução para comparar as versões do kernel Unix. E isso deve funcionar para outras pessoas, como o gcc. Eu só me importo com o primeiro número da versão 2, mas você pode adicionar outra camada de lógica. É um forro e eu escrevi em várias linhas para entender.

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
}

Você pode modificar isso e usá-lo para verificar a versão do gcc.

    
por 23.01.2018 / 00:15
0

Nós costumávamos fazer muita verificação de versão em um makefile GNU. Saímos pelas instalações do makefile. Nós tivemos que detectar os antigos compiladores Binutils e bugs e contorná-los rapidamente.

O padrão que usamos foi:

#!/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
    
por 25.11.2018 / 08:40