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.