O que há de errado com meu script de verificação de arquivos?

O que há de errado com meu script de verificação de arquivos?

Não entendo por que a última parte do meu script não exibe nada quando nenhum arquivo ou diretório é encontrado.

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

Não sei o que há de errado com meu código. Ele não exibirá o eco se um arquivo ou diretório inválido ou inexistente for inserido.

Responder1

Formatei novamente seu script para recuar as ifinstruções. Isso deixou mais claro que o seu último echosó acontece se -ffor verdadeiro e -dfalso. Se o usuário inserir um arquivo ou diretório que não existe, -ffalhará.

Considere esta revisão em sua última seção:

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

Onde a seção verdadeira da primeira ifinstrução termina anteriormente (por else); então, arquivos/diretórios que não existem têm uma seção de código para executar.

Responder2

Existem muitos outros tipos de arquivos que não causarão nenhuma saída neste código. Isso inclui links simbólicos, pipes nomeados, soquetes e arquivos especiais de blocos e caracteres. Notavelmente, /dev/tty, /dev/stdine falham, sem serem detectados pelo código /dev/stdout./dev/stderr

Você poderia modificar a lógica para levar em conta isso, no entanto, esta estrutura (estrutura de estilo de instrução case) é mais fácil de ler e menos propensa a erros:

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

informação relacionada