Ich bin noch sehr neu im Schreiben von Skripten in Bash und probiere nur ein paar Dinge aus, von denen ich dachte, dass sie grundlegende Dinge sind. Ich möchte DDNS ausführen, das von meinem Server mit Ubuntu 14.04 aktualisiert wird.
Ich habe mir bisher Code von dnsimple ausgeliehen:
#!/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
Die Idee ist, dass es alle 5 Minuten läuft, wobei ich mit einem Cronjob arbeite. Ich möchte dann die Ausgabe der Wellung überprüfen, um festzustellen, ob der Status "200" oder ein anderer ist. Wenn es etwas anderes ist, dann möchte ich die Ausgabe in eine Datei speichern.
Was ich nicht zum Arbeiten bringen kann, ist die if
Aussage. Soweit ich weiß, liefert -q
der grep
Befehl on einen Exit-Code für die if
Anweisung. Allerdings kann ich nicht scheinen, es zum Laufen zu bringen. Wo habe ich mich geirrt?
quelle
if
Prüfung entfernen und immer in die Protokolldatei zurückkehren? dnssimple zeigt ein$LOGIN
vorher$TOKEN
, aber das fehlt dir. Vielleicht scheitert das daran?DNSimple-Domain-Token
die dieLOGIN
Variable nicht benötigt ./var/tmp/icanhazip
), und wenn es sich seit dem letzten Durchlauf nicht geändert hat,exit 0
bevor Sie etwas anderes tun. Sie müssen Ihren DDNS-Eintrag nicht alle 5 Minuten aktualisieren, nur wenn sich Ihre IP-Adresse ändert.Antworten:
Du bist fast da. Lass einfach das Ausrufezeichen weg:
Ergebnis:
Die
if
Bedingung ist erfüllt, wenn grep mit dem Exit-Code 0 (was eine Übereinstimmung bedeutet) zurückgibt. Das!
Ausrufezeichen negiert dies.quelle
Da Sie bash bereits verwenden, können Sie es intern für bash belassen:
Probeläufe:
quelle
Dies ist keine Antwort auf Ihre Frage, sondern nur ein paar Vorschläge eines Kollegen:
$()
anstelle von Backticks nicht beideif
Anweisungen einrücken$()
Konsistenz und einfache Regeln helfen Ihnen, Skripte auf lange Sicht zu debuggen und zu warten ...
quelle