2012-09-16 13 views
6

मेरे पास यह देखने के लिए एक सरल स्क्रिप्ट है कि वेबपृष्ठ में एक निर्दिष्ट स्ट्रिंग है या नहीं। ऐसा लगता है:बैश स्ट्रिंग (कमांड आउटपुट) समानता परीक्षण

#!/bin/bash 
res=`curl -s "http://www.google.com" | grep "foo bar foo bar" | wc -l` 
if [[ $res == "0" ]]; then 
    echo "OK" 
else 
    echo "Wrong" 
fi 

जैसा कि आप देख सकते हैं, मैं "ठीक" प्राप्त करने के लिए देख रहा हूं, लेकिन "गलत" मिला।

इसके साथ क्या गलत है?

यदि मैं [$ res == "0"] का उपयोग करता हूं, तो यह काम करता है। अगर मैं res = curl... के बजाय res = "0" का उपयोग करता हूं, तो यह वांछित परिणाम भी प्राप्त कर सकता है।

इन मतभेदों क्यों हैं?

उत्तर

1

मैं में इस सवाल का जवाब मिल गया glenn jackman की सहायता।

मैं इस सवाल में निम्नलिखित अंक मिलता है:

  • wc -l के उत्पादन व्हाइटस्पेस होता है।
  • echo "$var"echo $var के बजाय
  • [[ साथ डिबगिंग वर के भीतर सभी पात्रों के वस्तुतः मान बरकरार रखता है।
  • [ प्रदर्शन से पहले उनके मूल्यों में विविधता फैलता है, ऐसा इसलिए है क्योंकि [वास्तव में test सेमीडी है, इसलिए यह Shell Expansions नियमों का पालन करता है।
16

आप देख सकते हैं क्या res शामिल हैं: echo "Wrong: res=>$res<"

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

string="foo bar foo bar" 
if curl -s "http://www.google.com" | grep -q "$string"; then 
    echo "'$string' found" 
else 
    echo "'$string' not found" 
fi 

या यहां तक ​​कि ग्रेप बिना:

text=$(curl -s "$url") 
string="foo bar foo bar" 
if [[ $text == *"$string"* ]]; then 
    echo "'$string' found" 
else 
    echo "'$string' not found in text:" 
    echo "$text" 
fi 
+0

धन्यवाद, यह अच्छा समाधान है। लेकिन, मेरे प्रश्न के रूप में, मैं सिर्फ यह जानना चाहता हूं कि [[$ res == "0"]] इस मामले में क्यों काम नहीं कर रहा है, ताकि मैं भविष्य में उसी गलतियों को बनाने से बच सकूं – kliu

+1

आप 'od' के साथ क्या देखते हैं -सी <<< "$ res" '? क्या अतिरिक्त सफेद जगह हैं? –

+0

हां, आप सही हैं, डब्ल्यूसी आउटपुट में सफेद जगहें हैं। धन्यवाद। – kliu

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