Loop para verificar se um pacote Debian está instalado ou não

1

Eu gosto de verificar se vários pacotes estão instalados ou não no Debian / Ubuntu Aqui está minha tentativa de um script para fazer isso:

query='dpkg-query -W -f '${Status}''
ok="install ok"

if ! [ '$query'  curl == "$ok" ] ;then 
apt-get -y -qq install curl >> /dev/null 2>&1
fi

O resultado é

Install: target Installed is not a directory 

mas deve ser o que você pode ver na segunda variável. Eu tenho uma dor de cabeça, npw porque eu não consigo descobrir o caminho certo para lidar com isso.

    
por Josh 24.01.2015 / 16:30

3 respostas

3

Você parece estar fazendo as coisas de uma maneira desnecessariamente complicada. Por que não apenas

dpkg -l curl || apt-get -y -qq install curl > /dev/null 2>&1

Você pediu por um one-liner depois de tudo. Como, presumivelmente, tudo que você quer é saber se curl está disponível, você também pode fazer apenas

type curl >/dev/null 2>&1 || apt-get -y -qq install curl
    
por 24.01.2015 / 17:43
2

Existem dois erros no seu código, um grave o outro não tanto:

  1. Você está usando backticks duas vezes. Também não use backticks. Use a substituição de comando da seguinte forma: $(command ...)

    query=$(dpkg-query -W -f '${Status}')
    

    A consulta já conterá o resultado da chamada de comando. Quando você agora executa

    '$query'
    

    agora você vai tentar executar o resultado, que é no seu caso uma string, para mim é uma string muito longa que consiste em install ok installedinstall ok installed...

  2. (Costas apontou isso) O resultado de dpkg-query -W -f '${Status}' curl será install ok installed , o que não é o que você verifica.

por 24.01.2015 / 16:44
0

Não há sentido em verificar se um pacote está instalado e instalando, se não estiver. Qualquer um:

  1. Você verifica o que deseja do pacote, como o binário curl: command -v curl , para que o usuário possa fornecer alternativas, se quiser.
  2. Você verifica se uma determinada versão do que você queria está instalada, usando algo como apt-cache policy .

Se nenhum dos casos se aplicar, será mais simples instalá-lo diretamente.

    
por 24.01.2015 / 16:49