Bash Script para definir o sistema operacional Linux

1

Estou trabalhando em um script bash e me deparei com um problema. Eu estou empurrando o que eu sei usando normal if / fi declarações e tentando usá-los para definir as variáveis relacionadas a pegar a versão do sistema operacional, como RH 7, Debian 7, Ubuntu, etc. O problema que estou tendo é que simplesmente não está funcionando como eu pensei que seria. Eu corro cada parte com a mão e funciona muito bem, mas quando eu coloco tudo em um script, nada.

Existe uma maneira melhor de fazer isso? Obrigado antecipadamente

value1=$(cat /etc/redhat-release | awk '{ print $4 }' | cut -c 1)
value2=$(cat /etc/redhat-release | awk '{ print $3 }' | cut -c 1)
value3=$(lsb_release -sr)
value4=$(cat /etc/debian_version)
if [[ $value1 -eq 7 ]] && [[ -e /etc/redhat-release ]]; then
        OS=RedHat
        VER=RH7
elif [[ $value2 -eq 6 ]] && [[ -e /etc/redhat-release ]]; then
        OS=RedHat
        VER=RH6
elif [[ $value3 = 14.04 ]]; then
        OS=Ubuntu
        VER=UB1404
elif [[ -e /etc/debian_version ]] && [[ $value4 -eq 7 ]]; then
        OS=Debian
        VER=DEB7
fi
    
por five0va 30.04.2015 / 00:20

1 resposta

0

Eu acho que seu problema pode ser alguns problemas com a comparação de floats e strings.
AFAIK, teste não pode lidar com valores flutuantes, então seu teste para $value3 = 14.04 dará a você syntax error: invalid arithmetic operator (error token is ".04") .

Você poderia apenas tratar os números como String assim:
elif [[ "$value3" == "14.04" ]]; then
Observe também as aspas em torno de $value3 , que também é necessário para tratar o 7.8 , que foi retornado no meu caso do debian 7.8, como string.

Se você quiser comparar apenas o número da versão principal, também poderá retirar a parte depois do ponto:
value3=$(lsb_release -sr | cut -d. -f1)
Isso dividirá a string retornada por lsb_release -sr no . que definimos como delimitador com o parâmetro -d. e, em seguida, selecionará a primeira coluna do resultado com -f1 .
Isso também funciona com value4:
value4=$(cat /etc/debian_version | cut -d. -f1)
Isso corta a saída do meu /etc/debian_version que foi 7.8 antes e 7 depois de adicionar o cut .

Você também pode querer suprimir avisos de arquivos inexistentes. Eu não tenho um sistema de redhat disponível, então eu redirecionei as mensagens de erro dos dois primeiros comandos para /dev/null desta forma:
value1=$(cat /etc/redhat-release 2> /dev/null | awk '{ print $4 }' | cut -c 1 )

Deixe-me saber se você precisar de alguma outra ajuda. Além disso, adicione algumas saídas e talvez até as saídas esperadas do seu script para que possamos ver onde está o seu problema.

    
por 30.04.2015 / 01:54