저는 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을 사용하여 작업한다는 것입니다. 그런 다음 컬의 출력을 확인하여 상태가 "200"인지 아니면 다른 것인지 확인하고 싶습니다. 다른 것이면 출력을 파일에 저장하고 싶습니다.
내가 일할 수 없는 것은 if
진술이다. 내가 이해한 바에 따르면 명령을 -q
실행하면 grep
해당 명령문에 대한 종료 코드가 제공됩니다 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