Você deve evitar usar / expandir strings se o que você deseja é uma lista de valores separados.
A solução básica é definir os parâmetros posicionais:
set -- "$1"/name_*
Isso manterá cada arquivo correspondente em um parâmetro posicional separado, mesmo com espaços ou novas linhas (ou a maioria dos outros caracteres).
No bash, você deve definir shopt -s failglob
para fazer o script parar se nenhum arquivo for correspondido pelo glob ( *
), ou shopt -s nullglob
se você quiser obter nenhum resultado (ao contrário do próprio glob "$1"/name_*
) se o glob não corresponder a nenhum arquivo. Mantenha o failglob desativado para evitar parar o script.
A contagem de arquivos ( conta o número de correspondências de uma glob ) é agora simplesmente:
echo "$#"
a contagem de parâmetros posicionais.
O loop for reduziria para:
for file
do echo "$file"
done
Isso evita completamente problemas com a divisão em IFS
.
Observe que os valores externos $1
devem ser citados para evitar a injeção de código.
Como também o echo "$file"
deve ser citado.
Também é possível atribuir uma lista a um array:
files=( "$1"/name_* )
Isso evitará a invasão dos parâmetros posicionais, mas tornará a sintaxe um pouco mais complexa. A contagem de elementos na matriz é:
echo "${#files[@]}"
E o loop precisará de algumas alterações:
for file in "${files[@]}"; do
echo "$file"
done