Eu ainda sou muito novo em scripts no bash, e apenas tentando algumas coisas que eu pensava serem coisas básicas. Quero executar o DDNS que atualiza do meu servidor executando o Ubuntu 14.04.
Tomando emprestado algum código do dnsimple, é isso que 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 idéia é que seja executado a cada 5 minutos, o que eu estou trabalhando usando um cronjob. Desejo, então, verificar a saída do curl 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 if
afirmação. Pelo que entendi, o -q
no grep
comando irá fornecer um código de saída para a if
declaração. No entanto, eu não consigo fazê-lo funcionar. Onde eu errei?
bash
shell-script
ubuntu
CircularRecursion
fonte
fonte
if
verificação e sempre ecoar no arquivo de log? O dnssimple mostra um$LOGIN
antes$TOKEN
, mas você está sentindo falta disso. Talvez isso esteja causando falhas nas coisas?DNSimple-Domain-Token
que não precisa daLOGIN
variável./var/tmp/icanhazip
) e, se não tiver sido alterado desde a última execução,exit 0
antes de fazer qualquer outra coisa. você não precisa atualizar sua entrada DDNS a cada 5 minutos, apenas quando o seu endereço IP for alterado.Respostas:
Você está quase lá. Apenas omita o ponto de exclamação:
Resultado:
A
if
condição será atendida se grep retornar com o código de saída 0 (o que significa uma correspondência). O!
ponto de exclamação negará isso.fonte
Como você já está usando o bash, você pode mantê-lo interno para o bash:
Amostras de execuções:
fonte
Esta não é uma resposta para sua pergunta, mas poucas sugestões de um colega de script:
$()
vez de backticks, não use os doisif
instruções condicionais$()
Regras consistentes e simples ajudarão você a depurar e manter scripts a longo prazo ...
fonte