在 bash 的条件语句中使用 grep

在 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。但是我似乎无法让它发挥作用。我哪里出错了?

答案1

你快到了。只需省略感叹号即可:

OUTPUT='blah blah (Status: 200)'
if echo "$OUTPUT" | grep -q "(Status:\s200)"; then
    echo "MATCH"
fi

结果:

MATCH

if如果 grep 返回退出代码 0(表示匹配),则满足条件。感叹号!将否定这一点。

答案2

由于您已经在使用 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

答案3

这是不是答案对于你的问题,但来自其他脚本编写者的一些建议:

  • 使用$()反引号代替,不要同时使用它们
  • 缩进条件if语句
  • 删除不必要的使用$()

一致性和简单的规则将帮助您长期调试和维护脚本......

#!/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

相关内容