Cir*_*ion 44 bash ubuntu shell-script
我对用 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
Run Code Online (Sandbox Code Playgroud)
这个想法是它每 5 分钟运行一次,我使用 cronjob 进行工作。然后我想检查 curl 的输出以查看状态是否为“200”或其他。如果是别的东西,那么我想将输出保存到一个文件中。
我无法工作的是if声明。据我了解,在-q该grep命令将提供一个退出码if声明。但是我似乎无法让它工作。我哪里错了?
Gui*_*ido 62
您快到了。省略感叹号:
OUTPUT='blah blah (Status: 200)'
if echo "$OUTPUT" | grep -q "(Status:\s200)"; then
echo "MATCH"
fi
Run Code Online (Sandbox Code Playgroud)
结果:
MATCH
Run Code Online (Sandbox Code Playgroud)
该if条件被满足,如果返回的grep,退出代码0(这意味着一个匹配)。该!感叹号会否定这一点。
小智 8
这不是您问题的答案,而是其他脚本编写者的一些建议:
$()反引号代替,不要同时使用它们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
Run Code Online (Sandbox Code Playgroud)
由于您已经在使用 bash,您可以将其保留在 bash 内部:
if [[ $OUTPUT =~ (Status:[[:space:]]200) ]]; then
echo match
fi
Run Code Online (Sandbox Code Playgroud)
示例运行:
OUTPUT='something bogus'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match
OUTPUT='something good (Status: 200)'
[[ $OUTPUT =~ (Status:[[:space:]]200) ]] && echo match
match
Run Code Online (Sandbox Code Playgroud)