एक चर में एक कमांड की निकास स्थिति कैसे निकालता है?


14

मैंने कुछ दिन पहले बैश सीखना शुरू किया।

मैं grepइस तरह से एक चर में अभिव्यक्ति की स्थिति से बाहर निकलने की कोशिश कर रहा हूँ :

check=grep -ci 'text' file.sh

और मुझे जो आउटपुट मिला वह है

No command '-ic' found

क्या मुझे इसे पाइप कमांड से करना चाहिए?


6
बाहर निकलने की स्थिति के लिए आप $?कमांड समाप्त होने के बाद सही जांच कर सकते हैं ।
coffeMug

और यदि आप पाइपलाइन में कमांड में से किसी एक की स्थिति चाहते हैं, तो आप PIPESTATUS सरणी की जांच कर सकते हैं।
कैस

जवाबों:


26

आपकी आज्ञा,

check=grep -ci 'text' file.sh

के रूप में खोल से व्याख्या की जाएगी "आदेश चला -ciतर्क के साथ textऔर file.sh, और चर सेट checkमूल्य को grepअपने वातावरण में"।


शेल चर में हाल ही में निष्पादित कमांड के निकास मूल्य को संग्रहीत करता है ?। आप अपने मूल्य को इस तरह से अपने स्वयं के चर में असाइन कर सकते हैं:

grep -i 'PATTERN' file
check=$?

यदि आप इस मूल्य पर कार्य करना चाहते हैं, तो आप अपने checkचर का उपयोग कर सकते हैं :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

या आप एक अलग चर का उपयोग कर छोड़ सकते हैं और $?सभी का एक साथ निरीक्षण कर सकते हैं:

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(ध्यान दें -q, यह grepकुछ भी उत्पादन नहीं करने और कुछ मैचों से जल्द से जल्द बाहर निकलने का निर्देश देता है; हम वास्तव में यहाँ क्या मैचों में रुचि नहीं रखते हैं)

या, यदि आप केवल "चीजें करना चाहते हैं" जब पैटर्न नहीं मिला है:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

$?किसी अन्य चर में बचत करना केवल तभी आवश्यक है जब आपको बाद में इसका उपयोग करने की आवश्यकता होती है, जब मूल्य $?को अधिलेखित कर दिया गया है, जैसे कि

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

उपरोक्त कोड स्निपेट में, परीक्षण $?के परिणाम द्वारा ओवरराइट किया जाएगा [ "$err" -ne 0 ] && [ ! -d "$dir" ]। यहां इसे सहेजना वास्तव में केवल आवश्यक है अगर हमें इसे प्रदर्शित करने और इसके साथ उपयोग करने की आवश्यकता है exit


4

आपका प्रश्न अस्पष्ट है लेकिन आपके द्वारा सबमिट किए गए कोड के आधार पर, ऐसा लगता है कि आप चाहते हैं कि चर कमांड checkके निकास की स्थिति को संग्रहीत करें grep। ऐसा करने का तरीका है दौड़ना

grep -ci 'text' file.sh
check=$?

जब एक खोल से एक कमांड चल रहा है, इसके बाहर निकलने की स्थिति, विशेष खोल पैरामीटर के माध्यम से उपलब्ध कराया गया है $?

यह शेल के लिए अपने विनिर्देश में POSIX (यूनिक्स की तरह के ऑपरेटिंग सिस्टम के लिए मानक) और बाश कार्यान्वयन को विशेष पैरामीटर के तहत प्रलेखित किया गया है ।

चूंकि आप एक नए शिक्षार्थी हैं, इसलिए मैं दृढ़ता से अनुशंसा करूंगा कि मूल बातें प्राप्त करने के लिए आप एक अच्छी किताब और / या ऑनलाइन ट्यूटोरियल से शुरुआत करें। स्टैक एक्सचेंज साइटों पर बाहरी संसाधनों की सिफारिशें हतोत्साहित की जाती हैं, लेकिन मैं लुनानाथ और ग्रेचैट के बैश गाइड का सुझाव दूंगा


4

आपने bash से कहा है कि check=grepवह जिस वातावरण में कमांड के पास जाए, उसे वेरिएबल सेट करें

-ci 'text' file.sh

लेकिन ciमौजूद नहीं है।

मेरा मानना ​​है कि आप उस आदेश को बैक-टिक्सेस में संलग्न करना चाहते हैं, या एक डॉलर के संकेत से पहले के कोष्ठकों में, जिनमें से किसी की गिनती इस बात को बताती है कि फ़ाइल में 'टेक्स्ट' कितनी लाइनों पर पाया गया था:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

अब $check0 होना चाहिए अगर कोई मैच नहीं, या सकारात्मक अगर कोई मैच था।


1

क्यों उत्पादन की जाँच करते समय -c का उपयोग कर उलझन में? इसका उपयोग यह जांचने के लिए किया जाता है कि कितनी बार कुछ मिलान किया गया है - यदि यह सफल है या नहीं।

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

लेकिन इस उदाहरण में

check="$(grep --silent -i 'text' file.sh; echo $?)"

यह एक एक्जिट कोड को छोड़कर कुछ भी आउटपुट नहीं करता है, जो तब प्रतिध्वनित होता है। यह वह आउटपुट है जिसे वेरिएबल चेक उपयोग करता है। मैं भी इसे पसंद करता हूं क्योंकि यह एक ही लाइन है।

आप -silent को -q से बदल सकते हैं। जब से आप grep आउटपुट में रुचि नहीं ले रहे हैं, मैं इसका उपयोग करता हूं, बस यह काम किया है या नहीं।

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

चर को grep कमांड के आउटपुट को असाइन करने का सही तरीका @ मोंटी-कठिन उल्लेख है:

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

हालांकि इस कमांड के एक्जिट स्टेटस को एक वैरिएबल पर असाइन $?करने के लिए आपको कमांड को निष्पादित करने के बाद शेल पैरामीटर का सही उपयोग करना होगा जैसा कि नीचे दिखाया गया है:

grep -ci 'text' file.sh
check=$?
echo $check
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.