Vous attribuez filesune 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 $filesvariable 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 shplace d' bashici en l'écrivant:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
setconsiste à 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 $filesn'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 $HOMEcontiennent 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 .