2012-01-23 14 views
26

me gustaría comprobar si existen ambos archivos, pero estoy consiguiendo¿Cómo se prueba si existen dos archivos?

test.sh: line 3: [: missing `]' 

Puede alguien ver lo que está mal?

#!/bin/sh 

if [ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]; then 
    echo "both exist" 
else 
    echo "one or more is missing" 
fi 
+2

Si usa 'prueba' en lugar de '[', el problema es más obvio. "si prueba -f .ssh/id_rsa && test -f .ssh/ir_rsa.pub; luego" funciona bien. –

Respuesta

33

Intente agregar un corchete adicional.

if [[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]]; then 
+3

Es específicamente '[[' (sin espacios) y no '[[' (con espacios). Por alguna razón, cuando vi esta respuesta, pensé que los espacios estaban bien, ¡pero no lo están! – gusterlover6

27
[ -f .ssh/id_rsa -a -f .ssh/id_rsa.pub ] && echo both || echo not 

o

[[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]] && echo both || echo not 

también, si para la solución [[ ]], es probable que quieren cambiar a #!/bin/sh#!/bin/bash de acuerdo con la etiqueta de su pregunta.

+0

'[[]]' también es compatible con 'ksh',' zsh' y probablemente con otros shells. Pero mejor use '#!/Bin/bash' que' #!/Bin/sh'. – olibre

+0

@oHessling, sí, solo estaba tratando de restringir mi respuesta al conjunto de proyectiles enumerados en la pregunta: uno en etiquetas, el otro en línea shebang. –

+0

Sí, su respuesta es perfecta (breve y correcta). Solo faltaba un comentario para señalar algún cumplimiento de shell. Pero este detalle no tiene que estar en su respuesta, solo en un pequeño comentario debajo ;-) Cheers – olibre

11

[[ es sintaxis específica de bash. Para los depósitos compatibles con POSIX, necesita:

[ -f file1 ] && [ -f file2 ] 
5
if [ -e .ssh/id_rsa -a -e .ssh/id_rsa.pub ]; then 
echo "both exist" 
else 
echo "one or more is missing" 
fi 

Aquí,

-e verificación sólo es el archivo salidas o not.If salidas, devuélvalo true.else, devuélvalo falsa.

-f también hacen lo mismo, pero comprueban si el archivo dado es un archivo normal o no.En función de eso devuelve el verdadero/falso.

Entonces usted está usando & &. Así que, necesita dos [[..]] corchetes para ejecutar.

en su lugar puede utilizar el -a [igual que & & operador] -o [igual que || operador]. Si necesita más información, vaya a este enlace

http://linux.die.net/man/1/bash.

Cuestiones relacionadas