2010-03-19 11 views
103

जब हमारा सर्वर आता है तो हमें यह देखने के लिए फ़ाइल जांचनी होगी कि सर्वर कैसे कॉन्फ़िगर किया गया है।यदि मैं/else कथन में बैश के अंदर फ़ाइल grep तुलना का उपयोग कैसे करूं?

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

MYSQL_ROLE=master 

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

यदि कथन के लिए BASH वाक्यविन्यास क्या है?

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

उत्तर

148

grep --help से, लेकिन यह भी देखना man 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$ के रूप में एक अधिक विशिष्ट regex, इस तरह के उपयोग करने के लिए, टिप्पणी में कि स्ट्रिंग से बचने के लिए चाहते हो सकता है, ऐसे नाम हैं जो केवल "मास्टर", आदि से शुरू करें

यह काम करता है क्योंकि एक आदेश लेता है और इसे चलाता है, और उस आदेश के वापसी मूल्य का उपयोग करने के लिए यह तय करने के लिए उपयोग करता है कि शून्य कैसे सही और गैर-शून्य अर्थ है झूठी — जैसे ही अन्य रिटर्न कोड शैल द्वारा व्याख्या किए जाते हैं, और इसके विपरीत

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 ] एक खोल है: सी

की तरह एक भाषा की
+0

धन्यवाद! एक जादू की तरह काम करता है। – user77413

27

if एक आदेश लेता है और इसके वापसी मूल्य की जांच करता है। [ सिर्फ एक आदेश है।

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

प्रयास करें:

if [ -n "`grep \"MYSQL_ROLE=master\" /etc/aws/hosts.conf`" ]; then 
+0

से इसमें कुछ समय ... अत्यधिक है। –

2

सिर्फ बैश

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" 
+0

ऐसा करने के लिए बहुत अच्छा तरीका! – nevelis

18

ध्यान दें कि, PIPE किसी भी आदेश या आदेशों के अनुक्रम, तो किया जा रहा है के लिए उपयोग बिल्टिन test expr के लिए शॉर्टेंड।

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

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

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

† कुछ प्लेटफॉर्म [ expr ] परअंतर्निहित नहीं है, लेकिन एक वास्तविक निष्पादन /bin/[ (जिसका अंतिम तर्क ] हो जाएगा), जिसके कारण [ expr ] वर्ग कोष्ठक के आसपास रिक्त स्थान को शामिल करना चाहिए, और क्यों यह पालन किया जाना चाहिए one of the command list separators (;, &&, ||, |, &, newline)

+3

'-l' अनावश्यक है, 'grep'' -q' के साथ किसी भी मैच को खोजने पर तत्काल लौटाता है – BroSlow

संबंधित मुद्दे