Essa ideia vai tornar as coisas um pouco mais complexas, mas eu proponho que a maneira mais apropriada de fazer isso é utilizar testes apropriados em seu script. Algo para o efeito de:
#!/bin/bash
if [[ -n $1 ]]; then
dirname=$1
fi
if [[ -z $dirname ]]; then
echo "Enter directory name."
read dirname
fi
check() {
if [[ -d "$dirname" ]]; then
echo "Directory already exists."
echo "Enter new directory name."
read dirname
check
elif [[ -e "$dirname" ]]; then
echo "$dirname already exists, but is not a directory."
echo "Enter new directory name."
read dirname
check
else
if mkdir -p -- "$dirname"; then
echo "Directory created"
ls -ld "$dirname"
fi
exit
fi
}
check
Isso preservaria a mensagem de erro da chamada que você faz (mkdir), bem como executaria alguns testes úteis para fornecer feedback sobre o motivo de uma tentativa falhar. Além disso, você pode, opcionalmente, passar o nome do diretório desejado como um argumento de linha de comando, e ele só pedirá que você o insira na segunda tentativa.