Sie weisen files
eine skalare Variable anstelle einer Array- Variablen zu.
Im
files=$HOME/print/*.pdf
Sie zuweisen einige Zeichenfolge wie /home/highsciguy/print/*.pdf
zum $files
Skalar (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 sh
anstelle von bash
hier verwenden, indem Sie sie schreiben:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
ist 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 $files
nicht 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 $HOME
sie 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 .