2011-01-11 12 views
9

Estaba escribiendo una declaración if que verifica si un archivo es legible y existe al hacer lo siguiente :Comprobando si un archivo es legible y existe en una condición if: if [[-r -f "/file.png"]]

if [[ -r "$upFN" && -f "$upFN" ]]; then 
.... 
fi 

luego pensé, hosco puede hacer que este pequeño, tal vez algo como esto:

if [[ -r -f "$upFN" ]]; then 
.... 
fi 

Pero esto no funciona, devuelve errores:

./ftp.sh: line 72: syntax error in conditional expression 
./ftp.sh: line 72: syntax error near `"$upFN"' 
./ftp.sh: line 72: `if [[ -r -f "$upFN" ]]; then' 
+0

'-f' es para archivos,' -d' es para directorios. – dreamlax

+0

Vaya, no quise tener/carpeta/en el título: P – Mint

Respuesta

13

AFAICT, no hay forma de combinarlos más. Como nota de portabilidad, [[ expr ]] es menos portátil que [ expr ] o test expr. El estilo C && y || solamente se incluyen en bash lo que podría querer considerar el uso de la sintaxis POSIX de -a para y y -o para o. Personalmente, prefiero usar test expr ya que es muy explícito. Muchos shells (incluidos bash) incluyen un builtin para que no tenga que preocuparse por la sobrecarga de creación de procesos.

En cualquier caso, me gustaría volver a escribir su ensayo como:

if test -r "$upFN" -a -f "$upFN" 
then 
    ... 
fi 

que la sintaxis trabajará en el tradicional shell Bourne, Korn y Bash. También puede usar la sintaxis [ de forma portátil.

+0

Siempre pensé que [[expr]] era más seguro que [expr] cuando usaba variables en ellos. No sabía que || y && solo trabaja en bash, usará -ao como lo sugirió a partir de ahora. Cheers – Mint

+3

Entonces, ¿cuándo deberían usarse las características específicas de Bash? –

4

¿Hay algún caso en el que un archivo sea legible pero no existe? No se preocupe por verificar la existencia cuando la legibilidad le dirá todo lo que necesita.

+3

'-r' comprueba la legibilidad y' -f' comprueba si hay un * archivo *. La porción '-r' podría tener éxito para un directorio y' -f' fallará. La publicación no menciona que '-f' requiere que el elemento sea un archivo. '-e' verifica la existencia. –

+0

Pensé que -f y -r nunca tendrían éxito si el archivo no existe, nunca he oído hablar de -e, tendré que consultar al hombre. – Mint

+1

Eche un vistazo a http://pubs.opengroup.org/onlinepubs/007908799/xcu/test.html –

Cuestiones relacionadas