Chuleta 06 ¿El fichero existe?
Cuando empiezas a tirar código Shell con cierta soltura empiezas a meter validaciones digamos que básicas, ¿existe el fichero de configuración de este proceso?, ¿y la ruta del fichero de log que voy a grabar?, ¿el fichero de datos a procesar existe? ¿lo puedo leer? ¿y además tiene datos o está vacio?
A todas estas preguntas y a bastantes más podemos dar respuesta con un simple IF y la correspondiente evaluación del fichero/directorio.
Utilizaremos la expresión de test, la cual podemos expresar con estas tres sintaxis:
test EXPRESION
[ EXPRESION ]
[[ EXPRESION ]]
La primera comprobación, la más básica que podemos hacer es comprobar si el elemento existe, sea un fichero, un directorio o un enlace, para essto emplearemos la opción -e
ahernan:/tmp$ FIC=/tmp/pp
ahernan:/tmp$ if test -e "$FIC"; then echo "$FIC existe"; fi
/tmp/pp existe
ahernan:/tmp$ FIC=/tmp/pp
ahernan:/tmp$ if test -f "$FIC"; then echo "$FIC existe y es un fichero regular"; fi
/tmp/pp existe y es un fichero regular
&&
cuando el resultado de la evaluación del test es verdadero, o a la derecha de los ||
cuando la evaluación del test es falso.
ahernan:/tmp$ FIC=/tmp/pp
ahernan:/tmp$ [[ -f $FIC ]] && echo "$FIC existe y es un fichero regular" || echo "$FIC no existe o no es un fichero regular"
/tmp/pp existe y es un fichero regular
Tipo del descriptor:
-b | Devuelve TRUE si existe y se trata de un Block device o special block file |
-c | Devuelve TRUE si exsite y se trata de un fichero de caracteres |
-d | Devuelve TRUE si existe y es un directorio |
-f | Devuelve TRUE si existe y es un fichero regular. |
-S | Devuelve TRUE si existe y es un socket. |
-p | Devuelve TRUE si existe y es un pipe |
-L | Devuelve TRUE si existe y es un enlace simbólico |
-h | Devuelve TRUE si existe y es un enlace simbólico |
Permisos del descriptor:
-u | Devuelve TRUE si existe y tiene el flag de set-user-id (suid) activo |
-g | Devuelve TRUE si existe y tiene el flag de set-group-id (sgid) activo |
-k | Devuelve TRUE si existe y activo el flag de sticky bit |
-w | Devuelve TRUE si existe y es escribible |
-x | Devuelve TRUE si existe y es ejecutable |
-r | Devuelve TRUE si existe y es leible |
Otros acerca del descriptor:
-s | Devuelve TRUE si existe y tienen tamaño distinto de 0 |
-G | Devuelve TRUE si existe y el descriptor tiene el mismo grupo que el usuario que ejecuta el comando |
-O | Devuelve TRUE si exsite y el descriptor tiene el mismo propietario que el usuario que ejecuta el comando |