बैश में सशर्त बयान में grep का उपयोग करना


22

मैं अभी भी बैश में स्क्रिप्टिंग के लिए बहुत नया हूं, और बस कुछ कोशिश कर रहा हूं जो मुझे लगा कि बुनियादी चीजें होंगी। मैं DDNS चलाना चाहता हूं जो Ubuntu 14.04 चलाने वाले मेरे सर्वर से अपडेट होता है।

कुछ कोड 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 मिनट में चलता है, जिसे मैंने क्रोनजोब का उपयोग करके काम किया है। मैं तब यह देखने के लिए कर्ल के आउटपुट की जांच करना चाहता हूं कि क्या स्थिति "200" या अन्य है। अगर यह कुछ और है, तो मैं आउटपुट को एक फ़ाइल में सहेजना चाहता हूं।

मैं जो काम नहीं कर सकता वह ifबयान है। जैसा कि मैं इसे समझता हूं, कमांड -qपर बयान grepके लिए एक निकास कोड प्रदान करेगा if। हालाँकि मुझे यह काम नहीं मिल रहा है। मैं कहाँ पर गलत हो गया?


यदि आप ifचेक हटाते हैं और लॉग फ़ाइल में हमेशा गूँजते हैं तो क्या आपकी स्क्रिप्ट काम करती है ? dnssimple$LOGIN पहले दिखाता है $TOKEN, लेकिन आप उसे याद कर रहे हैं। शायद यही कारण है कि चीजें विफल हो रही हैं?
मिकेल

1
मैंने इसे थोड़ा संशोधित किया है। मैं एक का उपयोग कर रहा हूँ DNSimple-Domain-Tokenजो LOGINचर की जरूरत नहीं है ।
सर्कुलरकारसन

अगर मैं तुम थे, मैं इसे केवल तभी चलाऊंगा जब इंटरनेट नेटवर्क इंटरफ़ेस क्रोन से हर 5 मिनट के बजाय ऊपर जाता है। या, कम से कम, "$ IP" को किसी फ़ाइल में कहीं (शायद /var/tmp/icanhazip) कैश करें और यदि वह अंतिम रन के बाद, exit 0कुछ भी करने से पहले नहीं बदला है। आपको अपने डीडीएनएस प्रविष्टि को हर 5 मिनट में अपडेट करने की आवश्यकता नहीं है, केवल तभी जब आपका आईपी पता बदलता है।
कैस

अच्छा विचार - मैं इसे जोड़ने पर काम करूंगा।
सर्कुलरक्रिसियन

जवाबों:


28

तुम लगभग वहां थे। विस्मयादिबोधक चिह्न छोड़ें:

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

परिणाम:

MATCH

ifहालत से बाहर निकलें कोड 0 (जो एक मैच का मतलब है) के साथ करता है, तो ग्रेप रिटर्न पूरी हो जाती है। !विस्मयादिबोधक चिह्न इस नकारना होगा।


5

चूँकि आप पहले से ही बैश का उपयोग कर रहे हैं, आप इसे बैश करने के लिए आंतरिक रख सकते हैं:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.