Solución:
Para comprobar si existe un directorio en un script de shell, puede utilizar lo siguiente:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
O para verificar si no existe un directorio:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
Sin embargo, como señala Jon Ericson, es posible que los comandos posteriores no funcionen como se esperaba si no tiene en cuenta que un enlace simbólico a un directorio también pasará esta verificación. Por ejemplo, ejecutando esto:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
Producirá el mensaje de error:
rmdir: failed to remove `symlink': Not a directory
Por lo tanto, es posible que los enlaces simbólicos deban tratarse de manera diferente, si los comandos posteriores esperan directorios:
if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
# It is a symlink!
# Symbolic link specific commands go here.
rm "$LINK_OR_DIR"
else
# It's a directory!
# Directory command goes here.
rmdir "$LINK_OR_DIR"
fi
fi
Preste especial atención a las comillas dobles que se utilizan para envolver las variables. La razón de esto se explica por 8jean en otra respuesta.
Si las variables contienen espacios u otros caracteres inusuales, probablemente hará que el script falle.
Recuerde siempre envolver las variables entre comillas dobles al hacer referencia a ellas en un script Bash. Los niños de estos días crecen con la idea de que pueden tener espacios y muchos otros personajes divertidos en los nombres de sus directorios. (¡Espacios! ¡En mis días, no teníamos espacios elegantes!;))
Un día, uno de esos niños ejecutará su guión con $DIRECTORY
ajustado a "My M0viez"
y tu guión explotará. No quieres eso. Así que usa esto.
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
Nota la -D La prueba puede producir algunos resultados sorprendentes:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
Archivo bajo: “¿Cuándo un directorio no es un directorio?” La respuesta: “Cuando es un enlace simbólico a un directorio”. Una prueba un poco más completa:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Puede encontrar más información en el manual de Bash sobre expresiones condicionales de Bash y [
comando incorporado y el [[
comando compuesto.