ব্যাশে শর্তাধীন বিবৃতিতে গ্রেপ ব্যবহার করা


22

আমি ব্যাশে স্ক্রিপ্টিংয়ের জন্য এখনও খুব নতুন এবং আমি যা চেষ্টা করেছি তা মৌলিক বিষয়গুলির জন্য চেষ্টা করছি। আমি ডিডিএনএস চালাতে চাই যা আমার সার্ভার উবুন্টু 14.04 চলছে from

ডিএনসিম্পল থেকে কিছু কোড ধার করা, আমার এ পর্যন্ত এটিই রয়েছে:

#!/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চেকটি সরিয়ে ফেলেন এবং লগ ফাইলটিতে সর্বদা প্রতিধ্বনিত হন তবে কি আপনার স্ক্রিপ্টটি কাজ করে ? ডিএনএস্পিম্পল এর$LOGIN আগে দেখায় $TOKENতবে আপনি এটি মিস করছেন। হতে পারে যে জিনিস ব্যর্থ কারণ?
মাইকেল

1
আমি এটিকে কিছুটা সংশোধন করেছি। আমি DNSimple-Domain-Tokenএমন একটি ব্যবহার করছি যা LOGINভেরিয়েবলের প্রয়োজন হয় না ।
সার্কুলার

আমি যদি আপনি থাকতাম তবে আমি কেবল তখনই চালিত করতাম যখন ক্রোন থেকে প্রতি 5 মিনিটের পরিবর্তে ইন্টারনেট নেটওয়ার্ক ইন্টারফেসটি উঠে যায়। বা, অন্তত, কোথাও একটি ফাইলে "$ আইপি" ক্যাশে করুন (সম্ভবত /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 (যা একটি ম্যাচ মানে) সঙ্গে যদি, grep আয় পূর্ণ করা হয়। !বিস্ময়বোধক চিহ্ন এই অস্বীকার করবে।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.