Toda variável é uma string.
Se você quiser distinguir "é um número" de "não é um número", teste isso.
while getopts d: OPTLET; do
case "$OPTLET" in
d)
case "$OPTARG" in
*[!0-9]*) echo 1>&2 "Non-numeric argument to -d, stopping."; exit 2;;
*) number_of_foo=$OPTARG;;
esac;;
esac
done
Não está claro, com sua pergunta, se isso é o que você realmente quer. Um número é uma string. 123
é um nome de arquivo válido. Portanto, se o argumento para -d
for um nome de arquivo em potencial, não há validação a ser feita. Qualquer sequência de caracteres é um nome de arquivo potencialmente válido.