2010-01-06 10 views
25

¿Qué hay de malo en mi código?Error de operador inesperado

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

salida

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

Respuesta

65

Es necesario utilizar = en lugar de == en la línea de [ $? == 0 ].

+0

razón por la cuál es la diferencia? – kapitanluffy

+1

@kapitanluffy [Porque el estándar dice que sí.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Especifica qué '' '' '' '' '' '' '', '' '' '' no se menciona en absoluto y es por lo tanto inválido. –

+0

Oh, estaba confundido ya que estoy viendo scripts que usan '==' en vez de '=' – kapitanluffy

-1

Probar:

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

Eso es un bashismo, y sé por el mensaje de error publicado que el OP no está utilizando bash. :-P –

+0

En primer lugar, algunas distribuciones tienen bash para su/bin/sh, FWIW. En este caso, creo que bash funciona con '=' o '==', por lo que es probable que el OP no usara bash (y solo bash admite el estilo '[[' 'creo que) FWIW. – rogerdpack

6

que debería cambiar a:

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

-eq hace una comparación numérica.

También puede aprovechar el hecho de que en la cáscara de un valor de retorno de 0 se considera el éxito y escribir el código de la siguiente manera:

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

Bueno, la comparación numérica o de cadenas realmente no importa aquí. – ephemient

+4

Exactamente mi problema. '==' solo es válido en ** bash ** pero estaba usando ** sh **. – karlphillip

+0

sh suele ser solo un enlace simbólico a otro intérprete. Estaba teniendo el mismo problema que OP, y encontré en mi instalación de Ubuntu, sh apunta a dash, que supongo usa = para comparar cadenas. –

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 
Cuestiones relacionadas