Bash
在 bash 的條件語句中使用 grep
我對用 bash 編寫腳本仍然很陌生,只是嘗試了一些我認為是基本的東西。我想執行從執行 Ubuntu 14.04 的伺服器更新的 DDNS。
從 dnsimple 借用一些程式碼,這就是我目前所擁有的:
#!/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
這個想法是它每 5 分鐘執行一次,我使用的是 cronjob。然後我想檢查 curl 的輸出,看看狀態是“200”還是其他。如果是別的東西,那麼我想將輸出保存到文件中。
我無法工作的是
if
聲明。據我了解,-q
ongrep
命令將為該if
語句提供退出程式碼。但是我似乎無法讓它工作。我哪裡出錯了?
您快到了。只需省略驚嘆號:
OUTPUT='blah blah (Status: 200)' if echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "MATCH" fi
結果:
MATCH
if
如果 grep 返回退出程式碼 0(表示匹配),則滿足條件。!
驚嘆號將否定這一點。
由於您已經在使用 bash,因此可以將其保留在 bash 內部:
if [[ $OUTPUT =~ (Status:[[:space:]]200) ]]; then echo match fi
樣品執行:
OUTPUT='something bogus' [[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match OUTPUT='something good (Status: 200)' [[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match match