Todavía soy muy nuevo en las secuencias de comandos en bash, y solo intento algunas que pensé que serían cosas básicas. Quiero ejecutar DDNS que se actualiza desde mi servidor que ejecuta Ubuntu 14.04.
Tomando prestado algún código de dnsimple, esto es lo que tengo hasta ahora:
#!/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
La idea es que se ejecuta cada 5 minutos, que tengo trabajando usando un cronjob. Luego quiero verificar la salida del rizo para ver si el estado es "200" u otro. Si es otra cosa, entonces quiero guardar la salida en un archivo.
Lo que no puedo hacer funcionar es la if
declaración. Como yo lo entiendo, la -q
del grep
comando proporcionará un código de salida para el if
comunicado. Sin embargo, parece que no puedo hacer que funcione. ¿Dónde me he equivocado?
bash
shell-script
ubuntu
Recursividad circular
fuente
fuente
if
verificación y siempre hace eco en el archivo de registro? dnssimple muestra un$LOGIN
antes$TOKEN
, pero te lo estás perdiendo. ¿Quizás eso está causando que las cosas fallen?DNSimple-Domain-Token
que no necesita laLOGIN
variable./var/tmp/icanhazip
) y si no ha cambiado desde la última ejecución,exit 0
antes de hacer cualquier otra cosa. no necesita actualizar su entrada DDNS cada 5 minutos, solo cuando cambia su dirección IP.Respuestas:
Ya casi estás ahí. Simplemente omita el signo de exclamación:
Resultado:
La
if
condición se cumple si grep regresa con el código de salida 0 (que significa una coincidencia). El!
signo de exclamación negará esto.fuente
Como ya estás usando bash, puedes mantenerlo interno para bash:
Ejecuciones de muestra:
fuente
Esta no es una respuesta a su pregunta, sino algunas sugerencias de un compañero scripter:
$()
lugar de backticks, no los use a ambosif
declaraciones condicionales$()
La coherencia y las reglas simples lo ayudarán a depurar y mantener los scripts a largo plazo ...
fuente