Bash Script para configurar o sistema operacional Linux

Bash Script para configurar o sistema operacional Linux

Estou trabalhando em um script bash e tive um problema. Estou empurrando o que sei usando instruções if/fi normais e tentando usá-las para definir variáveis ​​relacionadas à escolha da versão do sistema operacional, como RH 7, Debian 7, Ubuntu, etc. simplesmente não está funcionando como eu pensava. Eu executo cada parte manualmente e funciona perfeitamente, mas quando coloco tudo em um script, nada.

Existe uma maneira melhor de fazer isso? Agradeço 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

Responder1

Acho que seu problema pode ser alguns problemas com a comparação de carros alegóricos e strings.
AFAIK, o teste não pode lidar com valores flutuantes, então seu teste $value3 = 14.04fornecerá um arquivo syntax error: invalid arithmetic operator (error token is ".04").

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

Se quiser comparar apenas o número da versão principal, você também pode retirar a parte após o ponto:
value3=$(lsb_release -sr | cut -d. -f1)
Isso dividirá a string retornada por lsb_release -srat the .que definimos como delimitador com o -d.parâmetro e então selecionará a primeira coluna do resultado com -f1.
Isso também funciona com valor4:
value4=$(cat /etc/debian_version | cut -d. -f1)
isso corta a saída do my /etc/debian_versionque estava 7.8antes e 7depois de adicionar o cut.

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

Deixe-me saber se precisar de outra ajuda. Adicione também algumas saídas e talvez até saídas esperadas do seu script para que possamos ver onde está o seu problema.

informação relacionada