Verifique si el argumento pasado es un archivo o directorio en Bash

Estoy tratando de escribir un script extremadamente simple en Ubuntu que me permita pasarlo ya sea un nombre de archivo o un directorio, y poder hacer algo específico cuando es un archivo, y algo más cuando es un directorio. El problema que tengo es cuando el nombre del directorio, o probablemente también los archivos, tiene espacios u otros caracteres escapables están en el nombre.

Aquí está mi código básico a continuación, y un par de pruebas.

#!/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

Y aquí está el resultado:

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 esos caminos son válidos y existen.

Respuestas a la pregunta(8)

Su respuesta a la pregunta