Bash

在 bash 的條件語句中使用 grep

  • November 19, 2021

我對用 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聲明。據我了解,-qongrep命令將為該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

引用自:https://unix.stackexchange.com/questions/275329