2010-01-06 15 views
25

Cosa c'è di sbagliato nel mio codice?Errore imprevisto dell'operatore

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

uscita

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

risposta

65

è necessario utilizzare = invece di == nella linea [ $? == 0 ].

+0

perché che cosa è la differenza? – kapitanluffy

+1

@kapitanluffy [Perché lo standard dice così.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Specifica cosa '=' fa, ma '==' non è menzionato affatto ed è quindi non valido. –

+0

Oh, è stato confuso da quando ho visto script che utilizza '==' invece di '=' – kapitanluffy

-1

Prova:

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

Questo è un bashismo, e so dal messaggio di errore postato che l'OP non sta usando bash. :-P –

+0

Inizialmente, alcune distro hanno bash per il loro/bin/sh, FWIW. In questo caso penso che bash lavori con '=' o '==' quindi è probabile che l'OP non stia usando bash (e solo bash supporta lo stile [['style I think] FWIW. – rogerdpack

6

Si dovrebbe cambiare la situazione a:

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

-eq fa un confronto numerico.

Si può anche approfittare del fatto che in guscio un valore di ritorno pari a 0 è considerato il successo e scrivere il codice come questo:

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

Beh, il confronto numerico o di stringa non ha molta importanza qui. – ephemient

+4

Esattamente il mio problema. '==' è valido solo in ** bash **, ma stavo usando ** sh **. – karlphillip

+0

sh è in genere solo un collegamento simbolico a un altro interprete. Stavo avendo lo stesso problema di OP, e trovato sulla mia installazione di Ubuntu, ho indicato il trattino, che presumo usa = per confrontare le stringhe. –

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 
Problemi correlati