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/*