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

2

Eu não entendo porque 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

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

    
por David Prentice 02.11.2015 / 01:39

2 respostas

4

Eu reformatei o seu script para recuar as instruções if . Isso deixará mais claro que seu último echo ocorrerá somente se -f for true e -d for falso. Se o usuário inserir um arquivo ou diretório que não existe, então -f falhará.

Considere esta revisão para 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 instrução if é finalizada antes (por else ); então os arquivos / diretórios que não existem têm uma seção de código para executar.

    
por 02.11.2015 / 01:43
3

Existem muitos outros tipos de arquivos que não causam nenhuma saída neste código. Estes incluem links simbólicos, pipes nomeados, soquetes e arquivos especiais de bloco e caractere. Notavelmente, /dev/tty , /dev/stdin , /dev/stdout e /dev/stderr não são detectados pelo código.

Você pode modificar a lógica para considerar isso, no entanto, essa estrutura (estrutura de estilo de declaração de caso) é 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
    
por 02.11.2015 / 04:15