
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.04
fornecerá 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 -sr
at 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_version
que estava 7.8
antes e 7
depois 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/null
assim:
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.