¿Qué pasa con mi secuencia de comandos de verificación de archivos?

¿Qué pasa con mi secuencia de comandos de verificación de archivos?

No entiendo por qué la última parte de mi script no muestra nada cuando no se encuentra ningún archivo o directorio.

echo -n "Please enter a filename or directory: "
read filename
if [ -z "$filename" ]; then
  echo "You did not enter anything!"
  exit 1
fi
if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  else
    echo "You did not enter a valid file or directory."
  fi
fi
exit

No sé qué le pasa a mi código. No mostrará el eco si se ingresa un archivo o directorio no válido o inexistente.

Respuesta1

Volví a formatear su guión para sangrar las ifdeclaraciones. Al hacerlo, quedó más claro que lo último echosolo ocurre si -fes verdadero y -dfalso. Si el usuario ingresa un archivo o directorio que no existe, -ffalla.

Considere esta revisión de su última sección:

if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  fi
else
  echo "You did not enter a valid file or directory."
fi

Donde la sección verdadera de la primera ifdeclaración termina antes (por else); entonces los archivos/directorios que no existen tienen una sección de código para ejecutar.

Respuesta2

Hay muchos otros tipos de archivos que no generarán ningún resultado en este código. Estos incluyen enlaces simbólicos, canalizaciones con nombre, sockets y archivos especiales de bloques y caracteres. En particular, /dev/tty, /dev/stdiny /dev/stdoutfracasan /dev/stderrsin ser detectados por el código.

Puede modificar la lógica para tener en cuenta esto; sin embargo, esta estructura (estructura de estilo de declaración de caso) es más fácil de leer y menos propensa a errores:

if [ ! -e "$filename" ]; then
    echo "$filename does not exist"
    exit 1
elif [ -f "$filename" ]; then
    echo "You entered a file."
elif [ -d "$filename" ]; then
    echo "You entered a directory."
else 
    echo "$filename is not a regular file or directory."
    exit 2
fi

información relacionada