Escape corretamente esta string variável para que não saia

0

Eu tenho este script de shell:

UNZIP_FOUND=$(dpkg-query -W --showformat='${Status}\n' unzip|grep "install ok installed")
    if [ "" == "$UNZIP_FOUND" ]; then
        echo unzip not found, I will install it
        apt-get --assume-yes install unzip > /dev/null
    fi

No entanto, isso me produz uma frase a cada vez:

dpkg-query: no packages found matching unzip

antes de executar o passo de instalação real.

Existe uma maneira de se livrar disso?

Eu preciso apenas atribuir o valor do comando dkpg-query dentro da variável UNZIP_FOUND , mas eu não quero ecoá-lo.

Eu li que a maneira de fazer isso é cercar a atribuição da variável com 'aspas, eu tentei escapar da string assim:

UNZIP_FOUND='$(dpkg-query -W --showformat=\'${Status}\n\' unzip|grep "install ok installed")'

mas não funciona, provavelmente minha fuga foi ruim.

    
por user3450548 20.08.2017 / 13:39

2 respostas

3

Você poderia simplesmente fazer

 apt-get --assume-yes install unzip

Se estiver instalado, não fará nada (a menos que esteja desatualizado e, nesse caso, será atualizado).

Se você quiser quieto, adicione --quiet a isso ou redirecione para /dev/null :

apt-get -qq --assume-yes install unzip

( -qq é "extra quiet", mas veja o manual apt-get sobre esse sinalizador)

Se você realmente deseja consultar a existência do pacote primeiro, você pode fazer

if ! dpkg-query -W unzip >/dev/null 2>&1; then
  apt-get --assume-yes install unzip
fi

dpkg-query sai com um status de saída diferente de zero se não encontrar o pacote. Nós redirecionamos a saída padrão e o erro padrão para /dev/null , já que o que está escrito lá não é interessante.

O motivo pelo qual você recebe a mensagem de erro no terminal é que dpkg-query o grava no fluxo de erros padrão enquanto seu script captura apenas o fluxo de saída padrão.

    
por 20.08.2017 / 14:02
3
dpkg-query -W --showformat='${Status}\n' unzip 2>/dev/null
    
por 20.08.2017 / 13:47