Você está atribuindo files
como uma variável escalar em vez de uma variável de matriz .
No
files=$HOME/print/*.pdf
Você está atribuindo uma string como /home/highsciguy/print/*.pdf
à $files
variável escalar (também conhecida como string).
Usar:
files=(~/print/*.pdf)
ou
files=("$HOME"/print/*.pdf)
em vez de. O shell expandirá esse padrão globbing em uma lista de caminhos de arquivo e atribuirá cada um deles aos elementos da $files
matriz .
A expansão da glob é feita no momento da atribuição.
Você não precisa usar recursos sh não-padrão e pode usar o sistema em sh
vez de bash
aqui escrevendo-o:
#!/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 com que a concha expanda a glob no momento em que a $files
variável for expandida.
IFS= # disable word splitting
for file in $files; do ...
Aqui, como $files
não é citado (o que você normalmente não deve fazer), sua expansão está sujeita à divisão de palavras (que desativamos aqui) e geração de globbing / nome de arquivo.
Portanto, o *.pdf
será expandido para a lista de arquivos correspondentes. No entanto, se $HOME
contiverem caracteres curinga, eles também poderão ser expandidos, motivo pelo qual ainda é preferível usar uma variável de matriz.
files=$*
sempre usual ? Isso está errado .