2010-01-06 5 views
25

Quel est le problème dans mon code?Erreur d'opérateur inattendue

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

Sortie

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

Répondre

65

Vous devez utiliser = au lieu de == dans la ligne [ $? == 0 ].

+0

pourquoi ce qui est la différence? – kapitanluffy

+1

@kapitanluffy [Parce que la norme le dit.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Elle spécifie ce que '=' fait, mais '==' n'est pas mentionné du tout et est donc invalide. –

+0

Oh, était confus depuis que je vois des scripts qui utilise '==' au lieu de '=' – kapitanluffy

-1

Essayez:

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

C'est un bashisme, et je sais par le message d'erreur posté que l'OP n'utilise pas bash. :-P –

+0

A partir de là, certaines distributions ont bash pour leur/bin/sh, FWIW. Dans ce cas je pense que bash fonctionne avec '=' ou '==' donc il est probable que l'OP n'utilise pas bash (et seulement bash supporte le '[[' style je pense) FWIW. – rogerdpack

6

Vous devriez changer cela à:

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

-eq fait une comparaison numérique.

Vous pouvez également profiter du fait que dans la coquille d'une valeur de retour de 0 est considéré comme succès et écrivez votre code comme ceci:

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

Eh bien, la comparaison numérique ou chaîne n'a pas vraiment d'importance ici. – ephemient

+4

Exactement mon problème. '==' n'est valide que dans ** bash ** mais j'utilisais ** sh **. – karlphillip

+0

sh est généralement juste un lien symbolique vers un autre interpréteur. J'ai eu le même problème que OP, et trouvé sur mon installation d'Ubuntu, sh pointé vers le tableau de bord, que je suppose utiliser = pour comparer les chaînes. –

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 
Questions connexes