Isso acontece porque sua substituição de comando por ls produz espaços em branco e, por fim, passa pela divisão de palavras antes de ser passada para [
. Uma maneira menos quebrável seria colocar os arquivos em uma matriz e, em seguida, verificar se a matriz tem pelo menos um membro.
shopt -s nullglob
files=( FOO* )
if (( ${#files[@]} )); then
# there were files
fi
Isso funciona porque ((
por padrão retorna true se o valor não for igual a 0, e ${#files[@]}
obtém o número de itens na matriz (que será > 0 se houver arquivos correspondentes à glob). / p>
Você também pode fazer algo assim, contanto que nullglob
não esteja definido:
if ls FOO* >/dev/null 2>&1; then
# there were files
fi
Isto apenas verifica o código de saída de ls
, que será 1 se você passar um nome de arquivo que não existe (o literal FOO*
, se nada for correspondido (a menos, é claro, você é mau e lá é um arquivo chamado FOO*
, nesse caso ele retornará 0 :-))).
Note que ambos também correspondem aos diretórios. Se você realmente quer apenas combinar arquivos regulares, você precisa testar isso:
for file in FOO*; do
if [[ -f $file ]]; then
# file found, do some stuff and break
break
fi
done