यदि मैं bash के अंदर फ़ाइल grep तुलना का उपयोग करता / करती हूँ तो / कैसे बयान करें?


138

जब हमारा सर्वर ऊपर आता है, तो हमें यह देखने के लिए फ़ाइल की जांच करनी होगी कि सर्वर कैसे कॉन्फ़िगर किया गया है।

हम अपनी /etc/aws/hosts.conf फ़ाइल के अंदर निम्नलिखित स्ट्रिंग की खोज करना चाहते हैं:

MYSQL_ROLE=master

फिर, हम यह परीक्षण करना चाहते हैं कि क्या स्ट्रिंग मौजूद है या नहीं और स्ट्रिंग के मौजूद होने या न होने के आधार पर दो विकल्पों में से एक को चलाने के लिए स्टेटमेंट का उपयोग करें।

यदि स्टेटमेंट के लिए BASH सिंटैक्स क्या है?

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

जवाबों:


205

से grep --help, लेकिन यह भी देखें आदमी grep :

बाहर निकलने की स्थिति 0 है अगर किसी भी लाइन को चुना गया था, 1 अन्यथा; यदि कोई त्रुटि होती है और -q नहीं दी गई थी, तो निकास स्थिति 2 है।

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

आप अधिक विशिष्ट रीगेक्स का उपयोग करना चाह सकते हैं, जैसे ^MYSQL_ROLE=master$कि टिप्पणियों में उस स्ट्रिंग से बचने के लिए, नाम जो केवल "मास्टर" से शुरू होते हैं, आदि।

यह काम करता है क्योंकि यदि कोई कमांड लेता है और इसे चलाता है, और उस कमांड के रिटर्न मान का उपयोग करता है कि कैसे आगे बढ़ना है, शून्य अर्थ के साथ सही और गैर-शून्य का अर्थ गलत है - शेल द्वारा अन्य रिटर्न कोड की व्याख्या कैसे की जाती है और सी जैसी भाषा के विपरीत।


> शून्य अर्थ के साथ सत्य और गैर-शून्य का अर्थ असत्य है - शेल के द्वारा अन्य रिटर्न कोड की व्याख्या कैसे की जाती है, और सी जैसी भाषा के विपरीत लेकिन विपरीत क्यों ....?
kchoi

क्योंकि शून्य को आमतौर पर "कोई त्रुटि नहीं" के रूप में व्याख्या की जाती है, जबकि कुछ और का अर्थ "कुछ त्रुटि" है। अगर मान लें कि हम जानना चाहते हैं कि क्या कमांड सफलतापूर्वक पूरा हुआ है।
टिमरेल


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 ]निर्मित एक खोल है के लिए आशुलिपि test expr

के बाद से grepएक मैच के मामले में स्थिति 0, और कोई मेल नहीं करने के मामले में गैर-शून्य की स्थिति के साथ रिटर्न, आप का उपयोग कर सकते हैं:

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

उस उपयोग पर ध्यान दें, -lजिसमें केवल कम से कम एक मैच होने वाली फ़ाइल के बारे में परवाह है (ताकि grepजैसे ही वह एक मैच पाए, बिना अनावश्यक रूप से इनपुट फ़ाइल को पार्स करने के लिए जारी रहे।)

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