Como corrigir uma função no bash que verifica se um pacote RPM está instalado?

1

Eu escrevi esta função:

function isInstalled {
if [ rpm -q $1 &> /dev/null ]; then
    echo 'installed';
    return 1;
else
    echo 'not installed';
    return 0;
fi
}

Mas algo está errado. Sempre retorna 0. Mesmo quando o pacote está instalado. Eu acho que não estou verificando o sinal de retorno corretamente.

[vagrant@centos-7 ~]$ isInstalled wget2
not installed
[vagrant@centos-7 ~]$ isInstalled wget
not installed

[vagrant@centos-7 ~]$ rpm -q wget
wget-1.14-10.el7_0.1.x86_64
    
por deb0rian 25.12.2014 / 20:36

3 respostas

4

if [ rpm -q ... &> /dev/null ] é o uso inválido do [ incorporado. Você veria isso na mensagem de erro se você não redirecionasse o stderr, assim:

if [ rpm -q $1 >/dev/null ]; then

Todo comando executado tem um código de saída, portanto, não há necessidade de agrupar em [ ... ] e sua sintaxe é inválida.

Escreva assim:

isInstalled() {
    if rpm -q $1 &> /dev/null; then
        echo 'installed';
        return 1;
    else
        echo 'not installed';
        return 0;
    fi
}
    
por 25.12.2014 / 21:24
1

Sua função deve ser escrita como

isInstalled() {
    if rpm -q "$1" >/dev/null ; then
        echo "installed"
        return 0
    else
        echo "not installed"
        return 1
    fi
}

Notas:

  • A sintaxe mais portátil para definir uma função é

    function_name() {
        …
    }
    
  • Os colchetes [ ] são apenas para tipos específicos de testes , como por exemplo, se uma string está vazia. Você não precisa deles para verificar o status de saída de um comando.

  • Sua sintaxe de redirecionamento está errada.

  • Na programação shell, costuma-se retornar um status zero para o sucesso e um status diferente de zero para falha. Portanto, você deve trocar seus valores de retorno.

  • Você deve quase sempre usar aspas duplas sempre que fizer referência a qualquer variável. Caso contrário, seus scripts serão quebrados (possivelmente de maneiras comprometedoras da segurança) com entrada inesperada (como um caractere espaço no parâmetro).

por 26.12.2014 / 02:44
0
function isInstalled {
    rpm -q $1 &> /dev/null;

    if [ $? == 0 ]; then
            return true;
    else
            return false;
    fi
}

Teste: if [ isInstalled wget ]; then echo 'installed'; else echo 'not installed'; fi

    
por 25.12.2014 / 21:05

Tags