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 ifdeclaración. Como yo lo entiendo, la -qdel grepcomando proporcionará un código de salida para el ifcomunicado. Sin embargo, parece que no puedo hacer que funcione. ¿Dónde me he equivocado?
bash
shell-script
ubuntu
Recursividad circular
fuente
fuente

ifverificación y siempre hace eco en el archivo de registro? dnssimple muestra un$LOGINantes$TOKEN, pero te lo estás perdiendo. ¿Quizás eso está causando que las cosas fallen?DNSimple-Domain-Tokenque no necesita laLOGINvariable./var/tmp/icanhazip) y si no ha cambiado desde la última ejecución,exit 0antes 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
ifcondició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 ambosifdeclaraciones condicionales$()La coherencia y las reglas simples lo ayudarán a depurar y mantener los scripts a largo plazo ...
fuente