If, else baseado no comando piped to grep

5

Eu não consigo descobrir como fazer com que esse script (que deveria ser simples) funcione. Basicamente o que eu quero, rodar coisas diferentes baseado no estado do meu Parallels vm, algo assim:

if [ prlctl list --info ubuntu-vm | grep State == "State: running" ] ; then 
   echo 'machine is running'
else
   echo 'machine is not running'
fi

Claro que isso não funciona

    
por iLemming 07.05.2014 / 19:24

2 respostas

12

O problema é que você está colocando tudo em [ , ou seja, o comando test . Além disso, seu uso de grep está quebrado.

Tudo que você precisa é:

if prlctl list --info ubuntu-vm | grep -q "State: running"; then
   echo 'machine is running'
else
   echo 'machine is not running'
fi

Observe o uso de -q como um argumento para grep . Ele não escreve nada em STDOUT e sai com um status 0 se a correspondência for encontrada e diferente de zero.

    
por 07.05.2014 / 19:34
2

Uma verificação alternativa, menos "limpa", mas mais próxima do que a pergunta tentou alcançar.

Lembre-se de que [ em seu núcleo é apenas um comando. Ele sempre aceita um número específico de parâmetros e sai com status de saída 0 (sucesso) ou 1 (falha), como todos os outros comandos. Por exemplo, quando você está comparando duas strings, a sintaxe é [ , string 1, == , string 2, ] .

Agora você está usando isso como a condição if :

[ prlctl list --info ubuntu-vm | grep State == "State: running" ]

Mas é ambíguo de várias maneiras. Como [ saberia que à esquerda você tem um comando para executar e não uma string fixa? Como saberia que o == é o operador de comparação de string, em vez de apenas um argumento para grep ? Como saberia que o | faz parte do valor da esquerda, em vez de separar o comando em [ prlctl list --info ubuntu-vm e grep State == "State: running" ] ?

Portanto, o lado esquerdo também precisa ser citado. Além disso, como você deseja comparar a saída desse comando, em vez dos mundos "prctl list --info ...", você precisa do operador $(…) :

[ "$(prlctl list --info ubuntu-vm | grep State)" == "State: running" ]
    
por 07.05.2014 / 20:29