ich, dass ich in den Kommentaren hier sah einige Dinge zu Wort Spaltung und den Dateinamen Erweiterung löschen möchten.
Bei Verwendung der Variablenzuweisung Bash Reference Manual werden nur die folgenden Erweiterungen vorgenommen: Tilde-Erweiterung, Parametererweiterung, Befehlsersetzung, arithmetische Erweiterung. Das bedeutet, dass in Ihrer Variablen $files
wirklich nur ein Sternchen steht, da keine Dateinamenerweiterung stattfindet. An dieser Stelle müssen Sie sich also keine Gedanken über Zeilenumbrüche, Leerzeichen usw. machen, da sich in Ihrer Variablen keine Dateien befinden. Sie können dies mit declare -p files
sehen.
Dies ist der Grund, warum Sie beim Zuweisen zu einer Variablen kein Zitat angeben müssen.
var=$othervariable
ist die gleiche wie:
var="$othervariable"
Nun, wenn Sie Ihre Variable $files
in der for-Schleife verwenden for f in $files
(beachten Sie, dass Sie nicht $files
hier, weil der Dateiname Expansion würde nicht nehmen zitieren) Diese Variable wird erweitert und wird Worttrennung unterzogen. Aber der tatsächliche Wert ist JUST das Sternchen und Wortspaltung wird nichts mit dem Ergebnis tun! Zitiert die manual wieder: '?'
Nach Wort Spaltung, es sei denn, die Option -f eingestellt wurde (siehe Das Set Builtin), Bash prüft jedes Wort für die Zeichen '*', und '[' . Wenn eines dieser Zeichen angezeigt wird, wird das Wort als Muster angesehen und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die dem Muster entsprechen (siehe Musterabgleich).
Bedeutung dafür ist, dass Dateinamen Expansion nach variable Expansion und Wort Spaltung erfolgt. Also werden die um die Dateinamenerweiterung erweiterten Dateien nicht von IFS geteilt! Daher funktioniert der folgende Code nur fein:
#!/usr/bin/env bash
files=*
for f in $files; do
echo "<<${f}>>"
done
und richtig ausgibt:
<<file with many spaces>>
<<filewith* weird characters[abc]>>
<<normalfile>>
Eine kürzere Version dieses offensichtlich for f in *
anstelle der variablen $files
zu verwenden ist. Sie möchten definitiv auch jede Verwendung von $f
in Ihrer Schleife zitieren, da diese Erweiterung wirklich die Worttrennung durchläuft.
Dies gesagt, sollte Ihre Schleife ordnungsgemäß funktionieren.
Es hängt davon ab, in welchem Verzeichnis das Skript gestartet wird. Gibt es eine Datei? Mehr? – fernand0
Verwenden Sie nicht 'FILES'; Es unterliegt der Parametererweiterung * und der Worttrennung, was zu Problemen führen kann, wenn ein beliebiger Dateiname Leerzeichen enthält. Verwenden Sie einfach 'für f in *'. – chepner
Wo sollte die Zeichenfolge hinzugefügt werden? Ihre Frage ist ein bisschen knapp, weil sie die Anforderung nicht richtig erklärt. – sjsam