/ অন্য বিবৃতিতে ব্যাশটির মধ্যে কীভাবে আমি একটি ফাইল গ্রেপ তুলনা ব্যবহার করব?


138

আমাদের সার্ভারটি এলে সার্ভারটি কীভাবে কনফিগার করা আছে তা দেখতে আমাদের একটি ফাইল পরীক্ষা করা দরকার।

আমরা আমাদের /etc/aws/hosts.conf ফাইলের মধ্যে নিম্নলিখিত স্ট্রিংটির সন্ধান করতে চাই:

MYSQL_ROLE=master

তারপরে, আমরা সেই স্ট্রিংটি বিদ্যমান কিনা তা পরীক্ষা করতে চাই এবং স্ট্রিংটি বিদ্যমান কি না তার উপর নির্ভর করে দুটি বিকল্পের মধ্যে একটি চালানোর জন্য একটি / অন্য বিবৃতি ব্যবহার করুন।

যদি বিবৃতিটির জন্য BASH সিনট্যাক্সটি কী?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

উত্তর:


205

থেকে grep --help, কিন্তু মানুষ গ্রেপ দেখুন :

প্রস্থান স্থিতি 0 যদি কোনও লাইন নির্বাচিত হয়, অন্যথায় 1; যদি কোনও ত্রুটি দেখা দেয় এবং -কি দেওয়া না হয়, প্রস্থান স্থিতি 2।

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

আপনি ^MYSQL_ROLE=master$মন্তব্যগুলি, নামগুলি যে কেবল "মাস্টার" দিয়ে শুরু করেন ইত্যাদি নামগুলিতে স্ট্রিং এড়ানোর জন্য আরও নির্দিষ্ট নির্দিষ্ট রেজেক্স ব্যবহার করতে চাইতে পারেন etc.

এটি কাজ করে কারণ যদি একটি কমান্ড নেয় এবং এটি চালায়, এবং কীভাবে এগিয়ে যায় তার সিদ্ধান্ত নিতে সেই কমান্ডের রিটার্ন মান ব্যবহার করে শূন্য অর্থ সত্য এবং অ-শূন্য অর্থ মিথ্যা — একই সাথে অন্যান্য রিটার্ন কোড শেল দ্বারা কীভাবে ব্যাখ্যা করা হয় তা একই, এবং সি এর মতো ভাষার বিপরীত


> শূন্য অর্থ সত্য এবং অ-শূন্য অর্থ মিথ্যা — একই সাথে অন্যান্য রিটার্ন কোড শেল দ্বারা কীভাবে ব্যাখ্যা করা হয়, এবং সি'র মতো ভাষার বিপরীতে তবে কেন বিপরীত ....?
কেচোই

কারণ একটি শূন্য সাধারণত "ত্রুটিবিহীন" হিসাবে ব্যাখ্যা করা হয়, অন্য কোনও কিছুর অর্থ "কিছু ত্রুটি" থাকে। যদি ধরে নেওয়া হয় আমরা কমান্ডটি সফলভাবে সম্পন্ন হয়েছে কিনা তা জানতে চাই।
টাইমলিমার

33

ifএকটি কমান্ড নেয় এবং তার ফেরতের মান পরীক্ষা করে। [শুধু একটি আদেশ।

if grep -q ...
then
  ....
else
  ....
fi

23

মনে রাখবেন যে PIPEকোনও আদেশ বা আদেশের ক্রম হওয়ার পরে,

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

রেকর্ডের জন্য, [ expr ]builtin শেল হয় জন্য সাধারণভাবে সংক্ষেপে test expr

যেহেতু grepম্যাচের ক্ষেত্রে 0 স্থিতির সাথে রিটার্ন, এবং কোনও মিল নেই সেক্ষেত্রে শূন্য-স্থিতি না থাকায় আপনি ব্যবহার করতে পারেন:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

উল্লেখ্য ব্যবহারের -lযা শুধুমাত্র অন্তত একটি ম্যাচ না থাকার ফাইল বজায় রাখে (যাতে grepতাড়াতাড়ি এটা অযথা ইনপুট ফাইল বিশ্লেষণ অব্যাহত থাকলে এক ম্যাচ খুঁজে বের করে, যেমন আয়।)

কিছু প্ল্যাটফর্মের উপর [ expr ]নয় builtin, কিন্তু একটি প্রকৃত এক্সিকিউটেবল /bin/[(যার সর্বশেষ যুক্তি হতে হবে ], যার কারণে) [ expr ]বর্গাকার বন্ধনী প্রায় ঐ খালি থাকা উচিত এবং কেন এটি দ্বারা অনুসরণ করা আবশ্যক কমান্ড তালিকা বিভাজক এক ( ;, &&, ||, |, &, নতুন লাইন)


4
-lঅপ্রয়োজনীয়, এর grepসাথে কোনও মিল খুঁজে পেয়ে তাৎক্ষণিকভাবে ফিরে আসে-q
মোনিকা পুনরায় ইনস্টল করুন দয়া করে

3

শুধু বাশ ব্যবহার করুন

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.