Usando o grep na instrução condicional no bash

7

Eu ainda sou muito novo no script do bash e apenas experimento algumas coisas que achei que seriam básicas. Eu quero rodar o DDNS que atualiza do meu servidor rodando o Ubuntu 14.04.

Pegando algum código do dnsimple, é o que eu tenho até agora:

#!/bin/bash

LOGIN="email"
TOKEN="token"
DOMAIN_ID="domain"
RECORD_ID="record"
IP='curl -s http://icanhazip.com/'

OUTPUT='
curl -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "X-DNSimple-Domain-Token: $TOKEN" \
     -X "PUT" \
     -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \
     -d "{\"record\":{\"content\":\"$IP\"}}"'

if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then

echo "match"

$(echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log)
$(echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log)

fi

A ideia é que ele seja executado a cada 5 minutos, o que eu tenho trabalhando usando um cronjob. Então eu quero verificar a saída da onda para ver se o status é "200" ou outro. Se for outra coisa, quero salvar a saída em um arquivo.

O que não consigo trabalhar é a instrução if . Pelo que entendi, o comando -q no comando grep fornecerá um código de saída para a instrução if . No entanto, parece que não consigo dar certo. Onde eu errei?

    
por CircularRecursion 09.04.2016 / 14:27

3 respostas

10

Você está quase lá. Apenas omita o ponto de exclamação:

OUTPUT='blah blah (Status: 200)'
if echo "$OUTPUT" | grep -q "(Status:\s200)"; then
    echo "MATCH"
fi

Resultado:

MATCH

A condição if é preenchida se o grep retornar com o código de saída 0 (o que significa uma correspondência). O ponto de exclamação ! negará isso.

    
por 09.04.2016 / 15:03
3

Como você já está usando o bash, você pode mantê-lo interno no bash:

if [[ $OUTPUT =~ (Status:[[:space:]]200) ]]; then
  echo match
fi

Amostra é executada:

OUTPUT='something bogus'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match


OUTPUT='something good (Status: 200)'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match
match
    
por 09.04.2016 / 15:54
3

Esta não é uma resposta à sua pergunta, mas poucas sugestões de um colega criador de scripts:

  • Use $() em vez de backticks, não use os dois
  • Indent condicional if statements
  • Remover uso desnecessário de $()

Consistência e regras simples ajudarão você a depurar e manter scripts a longo prazo ...

#!/bin/bash

LOGIN="email"
TOKEN="token"
DOMAIN_ID="domain"
RECORD_ID="record"
IP=$(curl -s http://icanhazip.com/)

OUTPUT=$(
curl -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -H "X-DNSimple-Domain-Token: $TOKEN" \
    -X "PUT" \
    -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \
    -d "{\"record\":{\"content\":\"$IP\"}}"
)

if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then
    echo "match"
    echo "$OUTPUT" | grep -oP '(?<="message":")(.[^"]*)' >> /home/ddns/ddns.log
    echo "$OUTPUT"| grep -P '(Status:\s[0-9]{3}\s)' >> /home/ddns/ddns.log
fi
    
por 09.04.2016 / 16:05