Test es un comando para evaluar expresiones devolviendo 0 (cómo código de retorno) en el caso de que la expresión evaluada sea verdadera o un valor distinto de 0 en el caso de ser falso. Esto es la manera habitual para la shell, completamente diferente a la programación en C donde 0 es evaluado como falso y diferente de 0 como verdadero (aunque C no tiene tipos booleanos). Bueno que me estoy liando.
El caso es que test es capaz de analizar cadenas de texto, enteros y ficheros evaluando sus propiedades para analizar lo que más nos interese de estos elementos. Así por ejemplo para cadenas es capaz de determinar si estamos ante una cadana vacia o no (-n), si su longitud es cero (-z) si es igual a otro cadena (=). Para enteros puede determinar si son iguales, mayores o menores que otro dado y para ficheros que en mi modesta opinión es donde radica uno de sus puntos puede determinar un montón de cosas como:
FILE1 -ef FILE2
FILE1 y FILE2 son el mismo fichero en realidad (mismo inodo y dispositivo)
FILE1 -nt FILE2
FILE1 es más reciente que el FILE2 (por la fecha de modificación)
FILE1 -ot FILE2
FILE1 es más antiguo que FILE2
-b FILE
FILE existe y es un fichero de bloque especial (no un fichero regular, ver mknod)
-c FILE
FILE existe y es un dispositivo de tipo caracter (ver mknod)
-d FILE
FILE existe y es un directorio
-e FILE
FILE exite (sin entrar en otras consideraciones como en el caso de los otros parámetros)
-f FILE
FILE existe y es un fichero regular
-g FILE
FILE existe y tiene marcado el bit de GUID (id de grupo)
-G FILE
FILE existe y es poseido por el EGUID (id de grupo efectivo)
-h FILE
FILE existe y es un enlace simbólico (igual que el modificador -L)
-k FILE
FILE existe y tiene marcado el bit sticky
-L FILE
FILE existe y es un enlace simbólico (igual que el modificador -h)
-O FILE
FILE existe y es poseido por el EUID (id de usuario efectivo)
-p FILE
FILE existe y es una tuberia con nombre (ver FIFOs)
-r FILE
FILE existe y el usuario actual tiene permiso de lectura sobre él
-s FILE
FILE existe y tiene un tamaño mayor que cero
-S FILE
FILE existe y es un fichero tipo socket
-t FD
el descriptor de fichero FD esta abierto en una terminal
-u FILE
FILE exite y su SUID está marcado
-w FILE
FILE existe y el usuario actual tiene permiso de escritura sobre él
-x FILE
FILE existe y el usuario actual tiene permiso de ejecución (o busqueda) sobre él
Además test es capaz de concatenar varias expresiones empleando AND o OR lógicos con los siguientes modificadores:
EXPRESSION1 -a EXPRESSION2 (AND lógico)
EXPRESSION1 -o EXPRESSION2 (OR lógico)
Como ya he comentado antes test se emplea sobre todo en programación bash en instrucciones condicionales por acabar el articulo con un par de ejemplos que ilustraran claramente su utilización:
file="/tmp"
if [ -k $file ]
then
echo "El directorio /tmp tiene el bit sticky marcado";
fi
Otro ejemplo
cadena="hola"
if [ $cadena = "hola" ]
then
echo "Hola mundo!";
fi
Observad que en los ejemplos no hemos puesto ningún test pero es que en programación en bash y en este tipo de construcciones el corchete abierto [ es sinónimo de test (y por razones de eficiencia en un builtin (bash lo tiene incluido internamente y no llama al comando test al que emula)





0 Referencias