Vous attribuez files
une variable scalaire au lieu d'une variable de tableau .
Dans
files=$HOME/print/*.pdf
Vous assignez une chaîne comme /home/highsciguy/print/*.pdf
à la $files
variable scalaire (ou chaîne).
Utilisation:
files=(~/print/*.pdf)
ou
files=("$HOME"/print/*.pdf)
au lieu. Le shell étendra ce modèle de globalisation dans une liste de chemins de fichiers et affectera chacun d'eux aux éléments du $files
tableau .
L'expansion du glob se fait au moment de l'affectation.
Vous n'avez pas besoin d'utiliser des fonctionnalités sh non standard, et vous pouvez utiliser celles de votre système à la sh
place d' bash
ici en l'écrivant:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
consiste à affecter le "$@"
tableau de paramètres de position.
Une autre approche aurait pu être de stocker le motif de globulation dans une variable scalaire:
files=$HOME/print/*.pdf
Et que le shell développe le glob au moment où la $files
variable est développée.
IFS= # disable word splitting
for file in $files; do ...
Ici, parce qu'il $files
n'est pas cité (ce que vous ne devriez généralement pas faire), son expansion est sujette au fractionnement de mots (que nous avons désactivé ici) et à la génération de globbing / nom de fichier.
Ainsi, le *.pdf
sera étendu à la liste des fichiers correspondants. Cependant, s'ils $HOME
contiennent des caractères génériques, ils peuvent également être développés, c'est pourquoi il est toujours préférable d'utiliser une variable de tableau.
files=$*
que c'est habituel ? C'est tout à fait faux .