Stai assegnando files
come variabile scalare invece che come variabile array .
In
files=$HOME/print/*.pdf
Stai assegnando una stringa come /home/highsciguy/print/*.pdf
alla $files
variabile 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 sh
invece di bash
qui 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é $files
non è 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 $HOME
contenessero caratteri jolly, potrebbero essere espansi anche loro, motivo per cui è ancora preferibile utilizzare una variabile di matrice.
files=$*
mai il solito ? Questo è chiaramente sbagliato .