Nadal jestem nowy w skryptowaniu w bash i próbuję tylko kilku rzeczy, które moim zdaniem będą podstawowymi rzeczami. Chcę uruchomić DDNS, który aktualizuje z mojego serwera z Ubuntu 14.04.
Pożyczając trochę kodu z dnsimple, oto co mam do tej pory:
#!/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
Chodzi o to, że działa co 5 minut, co mam pracy przy użyciu cronjob. Następnie chcę sprawdzić wynik curl, aby zobaczyć, czy stan to „200” lub inny. Jeśli jest to coś innego, chcę zapisać dane wyjściowe w pliku.
To, czego nie mogę uruchomić, to if
oświadczenie. Jak rozumiem, -q
na grep
polecenia zapewni kod wyjścia dla if
stwierdzenia. Jednak nie wydaje mi się, żeby działało. Gdzie popełniłem błąd?
bash
shell-script
ubuntu
CircularRecursion
źródło
źródło
if
zaznaczenie i zawsze echo pliku dziennika? dnssimple pokazuje$LOGIN
wcześniej$TOKEN
, ale tego brakuje. Może to powoduje niepowodzenia?DNSimple-Domain-Token
który nie potrzebujeLOGIN
zmiennej./var/tmp/icanhazip
) i jeśli nie zmieniło się od ostatniego uruchomienia,exit 0
zanim zrobisz cokolwiek innego. nie musisz aktualizować wpisu DDNS co 5 minut, tylko przy zmianie adresu IP.Odpowiedzi:
Jesteś prawie na miejscu. Po prostu pomiń wykrzyknik:
Wynik:
if
Warunek jest spełniony, jeżeli grep powraca z kodem wyjściowym 0 (co oznacza meczu).!
Wykrzyknik będzie negować tego.źródło
Ponieważ już korzystasz z bash, możesz zachować wewnętrzną wersję bash:
Przykładowe przebiegi:
źródło
To nie jest odpowiedź na twoje pytanie, ale kilka sugestii innego autora:
$()
zamiast tyknięć, nie używaj ich obuif
zdania warunkowe$()
Spójne i proste reguły pomogą ci debugować i utrzymywać skrypty na dłuższą metę ...
źródło