2010-01-06 17 views
25

मेरे कोड में क्या गलत है?अप्रत्याशित ऑपरेटर त्रुटि

#!/bin/sh 

LOOK_FOR="$1" 

for i in `find $2 -name "*jar"`; do 
    echo "Looking in $i ..." 
    #jar tvf $i | grep $LOOK_FOR > /dev/null 
    jar tvf "$i" | grep "$LOOK_FOR" 

    if [ $? == 0 ] ; then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
    fi 
done #line 13 

आउटपुट

[email protected]:$ sh lookjar.sh org/apache/axis/message/addressing/EndpointReference /media/0C06E20B06E1F61C/uengine/uengine 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/build/uengine_settings.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/commons-fileupload.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/FCKeditor-2.3.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/processmanager/signedmetaworks.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/hsqldb.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/servlet.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/commons-discovery.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/google.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/jxl.jar ... 

उत्तर

65

आप [ $? == 0 ] लाइन में = बजाय == प्रयोग करना होगा।

+0

क्यों क्या अंतर है? – kapitanluffy

+1

@ kapitanluffy [क्योंकि मानक ऐसा कहता है।] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) यह निर्दिष्ट करता है कि '=' क्या करता है, लेकिन '==' बिल्कुल उल्लेख नहीं किया गया है और इस प्रकार अमान्य है। –

+0

ओह, जब मैं दो स्ट्रिंग बराबर या नहीं, तो तुलना करने के लिए '=' – kapitanluffy

-1

प्रयास करें:

if [[ $? == 0 ]]; then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
fi 
+4

यह एक झुकाव है, और मुझे पता है कि त्रुटि संदेश से पता चला है कि ओपी बैश का उपयोग नहीं कर रहा है। :- पी –

+0

शुरुआत में, कुछ डिस्ट्रो के पास उनके/बिन/श, एफडब्ल्यूआईडब्ल्यू के लिए बाश है। इस मामले में मुझे लगता है कि बैश या तो '=' या '==' के साथ काम करता है, इसलिए यह संभव है कि ओपी बैश का उपयोग नहीं कर रहा था (और केवल बैश '[[' शैली मुझे लगता है) FWIW का समर्थन करता है। – rogerdpack

6

आप करने के लिए कि बदलना चाहिए:

if [ $? -eq 0 ]; then 
    ... 

-eq एक अंकीय तुलना करता है।

तुम भी है कि खोल में 0 से वापसी मान सफलता माना जाता है इस तथ्य का लाभ उठाने और इस तरह अपने कोड लिख सकते हैं:

if jar tvf "$i" | grep "$LOOK_FOR"; then 
    ... 
+1

खैर, संख्यात्मक या स्ट्रिंग तुलना वास्तव में यहां कोई फर्क नहीं पड़ता। – ephemient

+4

बिल्कुल मेरी समस्या। '==' केवल ** bash ** में मान्य है लेकिन मैं ** sh ** का उपयोग कर रहा था। – karlphillip

+0

sh आमतौर पर एक अन्य दुभाषिया के लिए एक सिम्लिंक है। मुझे ओपी के समान समस्या थी, और मेरे उबंटू इंस्टॉलेशन पर पाया गया, sh ने डैश की ओर इशारा किया, जिसे मैं स्ट्रिंग की तुलना करने के लिए उपयोग करता हूं =। –

2
#!/bin/sh 
LOOK_FOR="$1"  
find $2 -name "*jar"`| while read -r file 
    echo "Looking in $file ..." 
    jar tvf "$file" | grep "$LOOK_FOR" 
    if [ $? -eq 0 ] ; then 
    echo "==> Found \"$LOOK_FOR\" in $file" 
    fi 
done 
संबंधित मुद्दे