2012-02-13 16 views
19

Aquí está mi código:Comparando parámetro de línea de comando para una cadena

#!/bin/bash 
if [ "$#" -ne 2 ] ; then 
     echo "$0: exactly 2 arguments expected" 
     exit 3 
fi 

if [$1 != "file" -a $1 != 'dir'] ; then 
     echo "$0: first argument must be string "file" or "dir"" 
     exit 1 
elif [-e $2 -a -r $2]; then 
     if ["$1" = "file" -a -f $2] ; then 
       echo YES 
     elif ["$1" = "dir" -a -d $2] ; then 
       echo YES 
     else 
       echo NO 
     fi 
     exit 0 
else 
     echo "$0: $2 is not a readable entry" 
     exit 2 
fi 

Si me quedo ./lab4 file filename1 se comprobará si el primer parámetro es la cadena "fichero" o "dir", entonces si el primer parámetro se "file" y filename1 es un archivo, imprimirá sí. Lo mismo para dir.

No reconoce $1 y $2. El código dará salida:

./lab04Q2: line 7: [file: command not found 
./lab04Q2: line 10: [-e: command not found 

aunque puse 2 parámetros cuando ejecuté el programa.

+0

Hola Janson, he editado tu pregunta por ti. En el futuro, considere usar una sangría de 4 espacios sobre cualquier cosa que deba tratarse como 'código' en sus publicaciones aquí. –

+0

gracias pensé que la sangría significaba usar la pestaña, pero eso no funcionó – JA3N

Respuesta

17

El (los) problema (s) provienen del hecho de que [ es realmente un comando. De hecho, es un alias para el comando test. Para que esto funcione correctamente, tendrá que añadir un espacio después de su [ como en:

if [ $1 != "file" -a $1 != 'dir' ] ; 

hacer esto para todas las instancias de [ que no tienen un espacio después de ella.

P.S.

Dado que está utilizando bash como su intérprete, Le recomiendo que utilice [[ ]] en lugar de [ ] para sus pruebas ya que el primero es mucho más capaz que este último sin inconvenientes; sin necesidad de un espacio es uno de ellos

+0

Y con eso ... mi tarea está hecha .. Gracias por su ayuda. – JA3N

+0

como si [[$ 1! = "Archivo" -a $ 1! = 'Dir']]; ? – JA3N

+0

@JansonChung '[[]]' permite más sintaxis similar a C, por lo que puede hacer 'if [[$ 1! =" File "&& $ 1! =" Dir "]]; entonces ... ' – SiegeX

39

Pruebe las siguientes 3 líneas en bash:

if [ "a" == "a" ]; then echo hi; fi 
if ["a" == "a" ]; then echo hi; fi 
if ["a" == "a"]; then echo hi; fi 

Vas a ver que sólo el primero trabaja, mientras que los otros dos no. es decir, su falta de espacios es la razón por la que su expresión no funciona.

El ejemplo anterior también sugiere que puede probar la sintaxis de bash directamente en el indicador bash. Puede hacerlo bien antes de incorporarlos a su secuencia de comandos.

+0

wth ... ¿Puedo comprarle cerveza? jaja ... – user1872384

+0

He utilizado su enfoque y no funcionó, esto funciona en caso de: if ["a" == "a"]; luego echo hola; fi Sin espacios entre los valores y signos iguales –

Cuestiones relacionadas