Você tem dois problemas principais.
O primeiro problema é o que acontece no primeiro comando: test ! -f ~/TAM/dustbin/* . Primeiro, o shell expande o padrão curinga ~/TAM/dustbin/* e, em seguida, passa a lista resultante para o comando test . Isso não funcionará se houver mais de um arquivo correspondente.
Com qualquer shell estilo Bourne, você pode salvar a lista de correspondências nos parâmetros posicionais e verificar se a primeira palavra existe (se isso não acontecer, o padrão não corresponde a nada).
set ~/TAM/dustbin/*
if ! test -f "$1"; then
echo "this directory is empty"
…
(Veja esta resposta para formas de tornar um padrão de globalização não correspondente expandido para uma lista vazia em ksh, bash e zsh.
Observe que o diretório pode não estar vazio: ele pode conter arquivos de ponto (arquivos cujo nome começa com . , que o padrão curinga * ignora. Se você quiser verificar a existência de arquivos de ponto também, a maneira mais fácil de transportar é usar find :
if [ "$(cd ~/TAM/dustbin && find . | head -n 1)" = "." ]; then
echo "this directory is empty"
else
set ~/TAM/dustbin/..?* ~/TAM/dustbin/.[!.]* ~/TAM/dustbin/*
for x; do
if [ -f "$x" ]; then
# $x is a regular file
elif [ -e "$x" ]; then
# $x is a directory or other special file
else
# $x is an unexpanded non-matching pattern
fi
done
fi
(Observe que test -f corresponde apenas a arquivos regulares; use -e para testar se existe um arquivo.)
Outro problema generalizado no seu script é que você não protege contra nomes de arquivos que contenham caracteres especiais do shell. Sempre use aspas duplas em torno das substituições de variáveis "$foo" e substituições de comandos "$(foo)" . Seu script pode sufocar ou remover o arquivo errado se um nome de arquivo contiver espaço em branco ou \[?* .
Eu assumo que este é um exercício de aprendizagem. Se não for:
#!/bin/bash
setopt nullglob
rm -ri ~/TAM/dustbin/*