Вы в значительной степени сказали, что нужно в вопросе:
if [ $# = 1 -a -d "$1" ] || [ $# = 2 -a ! -d "$1" ]
then
...
fi
Вы также можете использовать другие операторы - которые будут работать в оболочке Bourne, не говоря уже о Korn или других оболочках POSIX (при условии, что $ # работает правильно в функции - что и в Bash).
fun()
{
if [ $# = 1 -a -d "$1" ] || [ $# = 2 -a ! -d "$1" ]
then echo "Pass ($1, $#)"
else echo "Fail ($1, $#)"
fi
}
fun $HOME
fun $HOME abc
fun $HOME/xyz abc
fun /dev/null