2010-01-06 3 views
25

Was ist falsch in meinem Code?Unerwarteter Bedienerfehler

#!/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 

Ausgabe

[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 ... 

Antwort

65

Sie benötigen = statt == in der [ $? == 0 ] Linie zu verwenden.

+0

warum was ist der Unterschied? – kapitanluffy

+1

@kapitanluffy [Weil der Standard dies sagt.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Gibt an, was '=' bedeutet, aber '==' wird nicht erwähnt und ist somit ungültig. –

+0

Oh, war verwirrt, da ich Skripte sehe, die '==' statt '=' verwenden – kapitanluffy

-1

Versuchen:

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

Das ist ein Bashismus, und ich weiß aus der Fehlermeldung geschrieben, dass das OP Bash nicht verwendet. :-P –

+0

Anfangs haben einige Distributionen bash für ihre/bin/sh, FWIW. In diesem Fall denke ich, bash arbeitet entweder mit '=' oder '==' also ist es wahrscheinlich, dass das OP keine bash verwendet hat (und nur bash unterstützt das '[[' style I think]) FWIW. – rogerdpack

6

Sie sollten das ändern:

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

-eq hat einen numerischen Vergleich.

Sie können auch die Vorteile der Tatsache, dass ein Rückgabewert von 0 in der Schale Erfolg betrachtet wird und der Code wie folgt schreiben:

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

Nun, numerische oder String-Vergleich ist hier nicht wirklich wichtig. – ephemient

+4

Genau mein Problem. '==' ist nur in ** bash ** gültig, aber ich habe ** sh ** benutzt. – karlphillip

+0

sh ist normalerweise nur ein Symlink zu einem anderen Interpreter. Ich hatte das gleiche Problem wie OP, und fand auf meiner Ubuntu-Installation, sh zeigte auf den Bindestrich, was ich verwende = Strings zu vergleichen. –

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