2010-01-06 10 views
25

Co jest nie tak w moim kodzie?Nieoczekiwany błąd operatora

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

Wyjście

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

Odpowiedz

65

Trzeba użyć = zamiast == w linii [ $? == 0 ].

+0

dlaczego Jaka jest różnica? – kapitanluffy

+1

@kapitanluffy [Ponieważ standard tak mówi.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Określa, co '=' robi, ale '==' nie jest w ogóle wymienione i dlatego jest nieważny. –

+0

Oh, był zdezorientowany, ponieważ widzę skrypty, które używają "==" zamiast "=" – kapitanluffy

-1

Spróbuj:

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

To jest bashism i wiem z komunikatu o błędzie, że OP nie używa bash. :-P –

+0

Zaczynając, niektóre dystrybucje mają bash dla swoich/bin/sh, FWIW. W tym przypadku myślę, że bash działa z '=' lub '==', więc jest prawdopodobne, że OP nie używał bash (i tylko bash obsługuje 'FJW [[style" myślę że]). – rogerdpack

6

Należy zmienić na:

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

-eq robi porównanie numeryczne.

Można również skorzystać z faktu, że w powłoce zwracana wartość 0 jest uznane za sukces i napisać kod jak poniżej:

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

Cóż, porównanie liczbowe lub łańcuchowe nie ma tu większego znaczenia. – ephemient

+4

Dokładnie mój problem. '==' jest poprawne tylko w ** bash **, ale użyłem ** sh **. – karlphillip

+0

sh jest zwykle tylko dowiązaniem symbolicznym do innego tłumacza. Miałem ten sam problem co OP i znalazłem na mojej instalacji Ubuntu, sh wskazywało na myślnik, który, jak przypuszczam, używa = do porównywania ciągów. –

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 
Powiązane problemy