Você está atribuindo files
como uma variável escalar em vez de uma variável matriz .
Em
files=$HOME/print/*.pdf
Você está atribuindo string como /home/highsciguy/print/*.pdf
à variável $files
escalar (string).
Uso:
files=(~/print/*.pdf)
ou
files=("$HOME"/print/*.pdf)
em vez disso. O shell expandirá esse padrão de globbing em uma lista de caminhos de arquivos e atribuirá cada um deles a elementos da matriz $files
.
A expansão do glob é feita no momento da atribuição.
Você não precisa usar recursos sh não padrão e pode usar o sh
do seu sistema em vez de bash
escrevendo:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
é atribuir a matriz "$@"
de parâmetros posicionais.
Outra abordagem poderia ter sido armazenar o padrão de globbing em uma variável escalar:
files=$HOME/print/*.pdf
E faça o shell expandir o glob no momento em que a variável $files
for expandida.
IFS= # disable word splitting
for file in $files; do ...
Aqui, porque $files
não é citado (o que você normalmente não deve fazer), sua expansão está sujeita à divisão de palavras (que desabilitamos aqui) e geração de globbing / filename.
Assim, o *.pdf
será expandido para a lista de arquivos correspondentes. No entanto, se $HOME
continha caracteres curinga, eles também poderiam ser expandidos, e é por isso que ainda é preferível usar uma variável de matriz.