Verifique se o argumento passado é arquivo ou diretório no Bash

Eu estou tentando escrever um script extremamente simples no Ubuntu que me permita passar um nome de arquivo ou um diretório e ser capaz de fazer algo específico quando é um arquivo e outra coisa quando é um diretório. O problema que estou tendo é quando o nome do diretório, ou provavelmente os arquivos também, tem espaços ou outros caracteres escapáveis no nome.

Aqui está o meu código básico abaixo e alguns testes.

#!/bin/bash

PASSED=$1

if [ -d "${PASSED}" ] ; then
    echo "$PASSED is a directory";
else
    if [ -f "${PASSED}" ]; then
        echo "${PASSED} is a file";
    else
        echo "${PASSED} is not valid";
        exit 1
    fi
fi

E aqui está a saída:

andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory

andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file

andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid

andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid

Todos esses caminhos são válidos e existem.

questionAnswers(8)

yourAnswerToTheQuestion