Como avaliar grep resultar em bash?

1

Quero definir um status específico de um serviço ( tomcat8.service ).

Apenas se a string for encontrada, quero executar alguma lógica.

Problema: mesmo se eu executar o script no nome do serviço que não existe ("asd" neste exemplo), o if $status ainda corresponde e imprime. Mas por quê?

status = $(systemctl status asd.service | grep 'active')
echo $status

if $status
then 
    echo "$SERVICE was active"
    exit 0
fi 
exit 0

A saída do resultado é: asd.service was active , o que certamente não é verdade.

O echo $status imprime: status: Unknown job: =

    
por membersound 24.08.2017 / 15:31

2 respostas

2

Você pode usar o status de retorno do grep.

systemctl status asd.service | grep 'active' \
    && status=active \
    || status=not_active

if [ "$status" == "active" ]; then
    [...]
fi

ou ainda mais fácil:

test $(systemctl status asd.service | grep 'active') \
    && echo "$SERVICE was active"

ou se preferir if :

if $(systemctl status asd.service | grep 'active'); then
    echo "$SERVICE was active"
fi

De qualquer forma, tenha cuidado com as palavras-chave inactive , not active , active (exited) ou similares. Isso também corresponderá à sua declaração grep . Veja os comentários. Obrigado @ Terrance pela dica.

Atualização:

Não há necessidade de grep. systemctl tem o comando is-active incluído.

systemctl -q is-active asd.service \
    && echo "$SERVICE was active"

ou:

if systemctl -q is-active asd.service; then
    echo "is active";
fi
    
por RoVo 24.08.2017 / 15:41
0

Alguns comentários de revisão de código:

    As atribuições de variáveis
  • sh / bash / ksh / zsh parecem com var=value - não são permitidos espaços em torno de = . ( documentação )
  • status=$(some command) - a variável de status mantém a saída do comando, não o status de saída. O status de saída está na variável $?
  • a declaração if atua no status de saída do comando subseqüente ( documentação )

    if some_comment; then action1; else action2; fi
    

    Na maioria das vezes, o comando é [ ou [[ para testar alguma condição.

    No entanto, grep tem um status de saída claro: 0 se o padrão foi encontrado, 1 caso contrário. Então você quer isso:

    if systemctl status asd.service | grep -q 'active'; then
        echo "$SERVICE was active"
    fi
    
por glenn jackman 24.08.2017 / 15:51