2010-03-25 17 views
5
#!/bin/bash 
if test "$#" == "4"; then echo "$*"; else echo "args-error" >&2; fi; 

Este pequeño fragmento de código me preocupa mucho cuando intento ejecutarlo tanto en Ubuntu como en Cygwin.Error de sintaxis de Cygwin bash, pero el script se ejecuta perfectamente en Ubuntu

Ubuntu ejecuta la versión bash 4.0+, mientras que Cygwin ejecuta 3.2.49; Pero creo que la colisión de la versión no será la causa de esto, este código funciona bien en fedora 10 que también está utilizando bash versión 3. +

Así que, básicamente, me pregunto si hay una forma de codificar mi script de una vez y para todo para que no haya más problemas después.

Muchas gracias de antemano.

Editado: No tengo Cygwin a mano en este momento, pero de mi memoria, sigue diciendo algo así como no se pudo resolver el indefinido token "fi" algo así.

Editado: así, la forma original es así, acaba de encontrar desde el servidor:

#!/bin/bash 
if ["$#" == "4"]; 
    then echo "$*"; 
    else echo "args-error" >&2; 
fi; 

consola se queja:

$ ./test.sh 1 2 3 
./test.sh: line 2: [3: command not found 
args-error 

También me pregunto ¿cómo es que stderr dice algo va mal - comando no encontrado, pero aún puede imprimir la respuesta?

+1

¿Cuál es el error que está recibiendo? Este fragmento de código parece funcionar bien para mí (Ubuntu 9.10, bash 4.0.33). – crazyscot

+1

Se ve bien en mi Cygwin (también bash 3.2.49). ¿Cuál es el mensaje de error? – mob

+0

@mobrule: lo siento, esa es la versión fija mediante el uso de la declaración de prueba, he actualizado la pregunta, ahora existe el error ... –

Respuesta

7

Necesita espacios en blanco alrededor de [ y ].

#!/bin/bash 
if [ "$#" == "4" ]; 
    then echo "$*"; 
    else echo "args-error" >&2; 
fi; 
+0

@mobrule: gracias! Ahhh, nunca pensé que algo así pudiera cometer el error ... acostumbrarse a la sintaxis de Java ... –

+0

Es porque '[' es en realidad un alias de lo que solía ser un programa separado en Old Unix, llamado 'test'. Puede escribir lo anterior como "if test" $ # "==" 4 "] ... Ahora debería tener sentido por qué se necesitan los espacios. –

+0

@WarrenYoung, una corrección: prueba' antigua' de unix (y , de hecho, el estándar POSIX) no permite '==' como operador; necesita ser '=' para la comparación de cadenas o '-eq' para la comparación numérica. –

4

respuesta Actualizado:

Usted necesita un espacio después de lo contrario [["$#" se evalúa a [3 por ejemplo, que no existe. Prueba esto:

if [ "$#" == "4" ]; 
    then echo "$*"; 
    else echo "args-error" >&2; 
fi; 

Funciona para mí. Me imagino que usted está recibiendo un error como este:

test.sh: line 2: $'\r': command not found 
test.sh: line 3: $'\r': command not found 

Esto puede suceder debido a que ha editado el archivo con los finales de línea de estilo de Windows, pero Bash espera que los finales de línea al estilo Unix. Para solucionar el archivo, intente ejecutar este comando:

dos2unix test.sh 

Usted, por supuesto, necesita cambiar el nombre del archivo al nombre de archivo real de su guión.

+0

@Mark Byers: igual error para la versión original. Lo extraño es que imprime algo de stderr y luego obtiene la respuesta a stdout. Según tengo entendido, si algo sale mal, la ejecución del script debe ser eliminada ... –

+1

@Michael Mao: ver mi respuesta actualizada. –

+0

Gracias por su respuesta, lo siento solo puede dar un tic ... –

2

En su edición para mostrar la 'forma original' el problema parece ser que se está perdiendo un espacio entre la [ y el try "

1

utilizar el operador '=' en lugar de ' == '.Y también añadir un espacio después de [ y otro antes de ] como folowing

if [ "$ #" = "4"];
luego echo "$ *";
else echo "args-error"> & 2;
fi;

o incluso tratar '-eq' en lugar de '=='

if [ "$ #" eq "4"];

Debido a que en algunos sistemas, que no acepta el operador '=='

Cuestiones relacionadas