यह जाँचना कि क्या कमांड के आउटपुट में शेल स्क्रिप्ट में एक निश्चित स्ट्रिंग है


116

मैं एक शेल स्क्रिप्ट लिख रहा हूं, और मैं यह जांचने की कोशिश कर रहा हूं कि क्या कमांड के आउटपुट में एक निश्चित स्ट्रिंग है। मुझे लगता है कि मुझे शायद grep का उपयोग करना है, लेकिन मुझे यकीन नहीं है कि कैसे। क्या कोई जानता है?


क्या आपके द्वारा खोजे जा रहे आउटपुट स्ट्रिंग को जनरेट करने के बाद कमांड को चालू रखने की आवश्यकता है, या इसे उस समय तुरंत बंद किया जा सकता है? (आपके दो उत्तर इस संबंध में उनके शब्दार्थ के संदर्भ में भिन्न हैं)।
चार्ल्स डफी

जवाबों:


97

Grep के रिटर्न मान का परीक्षण करें:

./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
   echo "matched"
fi

जो मुहावरे की तरह किया जाता है:

if ./somecommand | grep -q 'string'; then
   echo "matched"
fi

और भी:

./somecommand | grep -q 'string' && echo 'matched'

2
यह कोड सभी POSIX गोले के साथ काम नहीं करता है: POSIX मानक के लिए केवल =तुलना ऑपरेटर होना आवश्यक है, नहीं ==; pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
चार्ल्स डफी

4
इसके अलावा, grep 'string' &>/dev/nullनिष्पादित करने के लिए गैर- POSIX आज्ञाकारी और बहुत धीमा दोनों है (यदि stringएक लंबी आउटपुट स्ट्रीम में जल्दी प्रकट होता है) grep -q string। [कैविएट वहाँ है अगर आप सुनिश्चित करना चाहते हैं कि somecommandउत्सर्जित होने के बाद भी चल रहा है string, तो जिस स्थिति में उपयोग किया जा रहा है grep -q- इसकी स्टैड को बंद करके और पहली बार stringदेखे जाने के बाद बाहर निकलना - काउंटरप्रोडक्ट हो सकता है]। (पुन: "नॉन-पॉसिक्स- कंप्लेंट ", &>एक एक्सटेंशन है - pubs.opengroup.org/onlinepubs/009695399/utilities/… POSIX- जनादेश पुनर्निर्देशन समर्थन का वर्णन करते हुए देखें )।
चार्ल्स डफी

यह समझाने में मदद करेगा कि यह क्यों काम करता है / प्रत्येक पैरामीटर क्या करता है, वाक्यविन्यास की पूरी समझ को प्रोत्साहित करने के लिए
redfox05

157

परीक्षण $?एक विरोधी पैटर्न है

if ./somecommand | grep -q 'string'; then
  echo "matched"
fi

अगर किसी भी तरह से आप केवल एक निश्चित स्ट्रिंग का परीक्षण करना चाहते हैं, तो एफ और एक्स विकल्प जोड़ें : grep -Fxq एफ पूरी लाइन के लिए तय (व्याख्या नहीं) और एक्स के लिए खड़ा है
एरडल जी।

4
$?एंटी-पैटर्न का परीक्षण क्यों किया जाता है?
विटाली ज़ेडेनविच

1
@VitalyZdanevich मुझे लगता है क्योंकि यह संगामिति के खिलाफ मजबूत नहीं है।
कोनराड रीच

@VitalyZdanevich, एक के लिए, परीक्षण $?पूर्ववर्ती आदेशों को "चेक" के रूप में set -eया ERRजाल के उद्देश्यों के लिए सेट नहीं करता है , इसलिए आपका प्रोग्राम उन मामलों में बाहर निकल सकता है, जहां आप चाहते हैं कि यह जानबूझकर-झूठे रास्ते से बाद में वापस आ जाए। दूसरे के लिए, $?अस्थिर वैश्विक स्थिति है - दुर्घटना द्वारा इसके मूल्य को फेंकना आसान है। उदाहरण के लिए, यदि आप जैसे लॉगिंग की एक पंक्ति जोड़ते हैं echo "Exit status is $?", तो नए मान $?से बाहर निकलने की स्थिति बन जाती है echo
चार्ल्स डफी

6

एक अन्य विकल्प कमांड आउटपुट पर नियमित अभिव्यक्ति मैच की जांच करना है।

उदाहरण के लिए:

[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"

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