Sie weisen fileseine skalare Variable anstelle einer Array- Variablen zu.
Im
files=$HOME/print/*.pdf
Sie zuweisen einige Zeichenfolge wie /home/highsciguy/print/*.pdfzum $filesSkalar (aka string) variabel.
Verwenden:
files=(~/print/*.pdf)
oder
files=("$HOME"/print/*.pdf)
stattdessen. Die Shell erweitert dieses Globbing-Muster zu einer Liste von Dateipfaden und weist sie jeweils Elementen des $files Arrays zu .
Die Erweiterung des Globs erfolgt zum Zeitpunkt der Zuordnung.
Sie müssen keine nicht standardmäßigen sh-Funktionen verwenden, und Sie können die Systeme Ihres Systems shanstelle von bashhier verwenden, indem Sie sie schreiben:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
setist das "$@"Array der Positionsparameter zuzuweisen .
Ein anderer Ansatz könnte darin bestanden haben, das Globbing-Muster in einer skalaren Variablen zu speichern :
files=$HOME/print/*.pdf
Lassen Sie die Shell den Glob zum Zeitpunkt der $files Erweiterung der Variablen erweitern.
IFS= # disable word splitting
for file in $files; do ...
Da dies $filesnicht in Anführungszeichen steht (was Sie normalerweise nicht tun sollten), unterliegt seine Erweiterung der Wortaufteilung (die wir hier deaktiviert haben) und der Generierung von Globbing / Dateinamen.
Das *.pdf wird also auf die Liste der passenden Dateien erweitert. Wenn $HOMEsie jedoch Platzhalterzeichen enthalten, können sie auch erweitert werden, weshalb die Verwendung einer Arrayvariablen immer noch vorzuziehen ist.
files=$*jemals üblich ? Das ist einfach falsch .