मैं परीक्षण कार्यक्रम में पाइप से मूल्य का उपयोग कैसे कर सकता हूं?


10
wc -l | test -eq 1

यह काम नहीं करता है। मैं 1 के मूल्य के साथ wc के परिणाम की तुलना करना चाहता हूं। मैं यह कैसे कर सकता हूं?

जवाबों:


9

यह पाइप के बारे में आपके प्रश्न का उत्तर नहीं देता है, लेकिन आप इसे पुनर्व्यवस्थित कर सकते हैं:

test $(ls -l | wc -l) -eq 1 && echo "worked"

और एसओ पर कुछ समाधान है , यह सबसे अच्छा है:

ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }

4

यदि आप बैश का उपयोग कर रहे हैं, तो आप संभवतः PIPESTATUS चर पर शोध करना चाहते हैं। जैसा कि बैश संदर्भ गाइड में उल्लेख किया गया है , PIPESTATUS है

एक सरणी चर (देखें Arrays) सबसे हाल ही में निष्पादित अग्रभूमि पाइपलाइन (जिसमें केवल एक आदेश शामिल हो सकता है) में प्रक्रियाओं से बाहर निकलने की स्थिति के मूल्यों की एक सूची है।

हम यह पता लगा सकते हैं कि पाइप लाइन के साथ इस पाइपलाइन के लिए निकास कोड क्या थे:

dmesg | grep -iw 'nnse' | wc -l

यदि आप अब सरणी चर को क्वेरी करते हैं, तो आपको पाइपलाइन में उपयोग किए गए आदेशों का उल्लेख करते हुए बाहर निकलने की स्थिति मिलती है:

echo ${PIPESTATUS[@]}
0 1 0

(अनुक्रमित सारणी में, ऊपर दिए गए बाहर निकलने वाले कोड सरणी में 0 1 और 2 द्वारा दर्शाए जाते हैं क्योंकि सरणियाँ हमेशा बैश में 0 से शुरू होती हैं।)

यहाँ हम दूसरा कमांड 1, और बाकी 0 देखते हैं; हालाँकि, wc -lशून्य मैच होने पर 0 रिटर्न देता है, जो कि कोई त्रुटि नहीं है। विफलता को एक शून्य-शून्य मान के साथ दर्शाया गया है, और अन्य त्रुटि मान हैं जैसे 127 जो कि कमांड नहीं मिला है, और फिर भी अधिक कोड जो संबंधित कार्यक्रम के लिए विशिष्ट हो सकते हैं।

यदि आप यह देखना चाहते हैं कि पाइपलाइन में किसी विशेष कमांड का एग्जिट कोड क्या है, तो आप उस मूल्य तक पहुंच सकते हैं। Grep कमांड ऊपर की पाइप लाइन में दूसरी कमांड थी, लेकिन जैसे ही 0 से शुरुआत होती है, हमें एंट्री वन की आवश्यकता होती है।

इसलिए grep कमांड के निकास कोड का पता लगाने के लिए, उपरोक्त पाइपलाइन को फिर से चलाएं (जैसे कि अगर आप चलाए हैं तो PIPESTATUS की सामग्री समाप्त हो गई होगी echo ${PIPESTATUS[@]}) और फिर नीचे दिए गए कमांड को निष्पादित करें, जो 1 (निकास कोड) वापस करेगा:

echo ${PIPESTATUS[1]}
1

एक स्क्रिप्ट में, सुनिश्चित करें कि पाइप लाइन ने आपको PIPESTATUS सरणी चर की सामग्री की तलाश करने से पहले निष्पादित करना समाप्त कर दिया है।

PIPESTATUS सरणी चर के दिलचस्प उपयोग के उदाहरण के लिए, बैश कमांड ग्रुपिंग और पाइप स्थिति के संयोजन के बारे में यह उत्तर देखें । आप टिप्पणियों में गाइल्स द्वारा सुझाए गए तरीके से सरणी चर का परीक्षण कर सकते हैं, हालांकि आपको पहले पाइपलाइन फिर से चलाने की आवश्यकता होगी:

dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here

यह सिर्फ एक टुकड़ा है, क्योंकि मुझे नहीं पता कि आप किस तरह की स्क्रिप्ट का इरादा कर रहे हैं, लेकिन मुझे उम्मीद है कि PIPESTATUS के बारे में जानना आपके लिए कुछ काम का हो सकता है। PIPESTATUS जैसे कई बैश एरे चर हैं जो बेहद उपयोगी हो सकते हैं; देख बैश संदर्भ गाइड पूरी सूची के लिए, और उनके उपयोग के उदाहरण के लिए अन्य Stackexchange साइटों।



1

यह हर कवर नहीं करता है testमामला है, लेकिन यदि आप एक नियमित अभिव्यक्ति, और उपयोग कर सकते हैं grepपाइप स्ट्रिंग, यह बहुत सीधे आगे है, क्योंकि grepहै testयह एक गैर शून्य निकास है कि में की तरह जब कोई मुकाबला नहीं पाया जाता है

cat file | wc -l | grep -qE '^\s*1\s*$'

विस्तारित नियमित अभिव्यक्तियाँ आपको इस तकनीक के साथ कई मामलों को कवर करने की अनुमति देती हैं। गिगल्स के लिए, एक परीक्षण मामला:

for i in 1 11 '' foo; do 
  if echo $i | grep -qE '^\s*1\s*$'; then 
    echo "'$i' matched"
  else
    echo "'$i' didn't match."
  fi
done

आउटपुट:

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