Stai assegnando filescome variabile scalare invece che come variabile array .
In
files=$HOME/print/*.pdf
Stai assegnando una stringa come /home/highsciguy/print/*.pdfalla $filesvariabile scalare (aka stringa).
Uso:
files=(~/print/*.pdf)
o
files=("$HOME"/print/*.pdf)
anziché. La shell espanderà quel modello globbing in un elenco di percorsi di file e assegnerà ciascuno di essi agli elementi $files dell'array .
L'espansione del glob viene effettuata al momento dell'incarico.
Non è necessario utilizzare funzioni sh non standard e si può usare il sistema shinvece di bashqui scrivendolo:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
setè assegnare l' "$@"array di parametri posizionali.
Un altro approccio potrebbe essere stato quello di memorizzare il modello globbing in una variabile scalare:
files=$HOME/print/*.pdf
E fai in modo che la shell espanda il glob nel momento in cui la $files variabile viene espansa.
IFS= # disable word splitting
for file in $files; do ...
Qui, poiché $filesnon è citato (cosa che normalmente non dovresti fare), la sua espansione è soggetta alla suddivisione delle parole (che qui abbiamo disabilitato) e alla generazione di globbing / nome file.
Quindi *.pdf verrà espanso all'elenco dei file corrispondenti. Tuttavia, se $HOMEcontenessero caratteri jolly, potrebbero essere espansi anche loro, motivo per cui è ancora preferibile utilizzare una variabile di matrice.
files=$*mai il solito ? Questo è chiaramente sbagliato .