Saya masih sangat baru dalam scripting di bash, dan hanya mencoba beberapa hal yang saya pikir akan menjadi hal mendasar. Saya ingin menjalankan DDNS yang diperbarui dari server saya yang menjalankan Ubuntu 14.04.
Meminjam beberapa kode dari dnsimple, inilah yang saya miliki sejauh ini:
#!/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
Idenya adalah itu berjalan setiap 5 menit, yang saya kerjakan menggunakan cronjob. Saya kemudian ingin memeriksa output dari ikal untuk melihat apakah statusnya "200" atau lainnya. Jika itu adalah sesuatu yang lain, maka saya ingin menyimpan output ke file.
Yang tidak bisa saya dapatkan adalah if
pernyataannya. Seperti yang saya pahami, -q
pada grep
perintah akan memberikan kode keluar untuk if
pernyataan. Namun sepertinya saya tidak bisa membuatnya bekerja. Di mana saya salah?
sumber
if
centang dan selalu menggema ke file log? dnssimple menunjukkan$LOGIN
sebelumnya$TOKEN
, tetapi Anda melewatkannya. Mungkin itu yang menyebabkan semuanya gagal?DNSimple-Domain-Token
yang tidak perluLOGIN
variabel./var/tmp/icanhazip
) dan jika itu tidak berubah sejak dijalankan terakhir,exit 0
sebelum melakukan hal lain. Anda tidak perlu memperbarui entri DDNS Anda setiap 5 menit, hanya ketika alamat IP Anda berubah.Jawaban:
Kamu hampir sampai. Hapus saja tanda seru:
Hasil:
The
if
kondisi terpenuhi jika kembali grep dengan kode keluar 0 (yang berarti pertandingan). Tanda!
seru akan meniadakan ini.sumber
Karena Anda sudah menggunakan bash, Anda bisa membuatnya internal untuk bash:
Sampel berjalan:
sumber
Ini bukan jawaban untuk pertanyaan Anda, tetapi beberapa saran dari sesama penulis skenario:
$()
daripada backticks, jangan gunakan keduanyaif
pernyataan bersyarat$()
Konsistensi dan aturan sederhana akan membantu Anda men-debug dan memelihara skrip dalam jangka panjang ...
sumber