Ich lerne Bash und möchte Leerzeichen durch andere "nicht leere" Zeichen ersetzen. Ich benutze eine for
Schleife:
for f in *\ *; do mv "$f" "${f// /_}"; done
Meine Frage ist, warum der doppelte Schrägstrich und der Raum in sind ${f// /_}
? Was macht ${f// /_}
das?
Antworten:
Das ist ein Ersatzmuster mit
bash
Parametererweiterung.In
${f// /_}
:Die doppelten Schrägstriche
//
ersetzen alle Vorkommen von Leerzeichen_
. Wenn Sie einen Schrägstrich einfügen/
, wird nur das erste Leerzeichen ersetztDas Leerzeichen ist da, weil Sie das Leerzeichen ersetzen (mit Unterstrich)
Das Muster ist also im Grunde:
Überprüfen Sie
man bash
, um weitere Informationen zu erhalten.Um sofort zum
Parameter Expansion
Abschnitt vonman bash
zu gelangen:quelle
Der Abschnitt
"{f// /_}
bedeutet, dass jedes Leerzeichen durch einen Unterstrich ersetzt wird. Hierbei wird die Bash-Parametererweiterung verwendet. Die inf
definierte Variablefor f in *\ *;
wird für jedes Match der Shell-Erweiterung (Globbing) durchlaufen. Jedes Mal, wenn der gefundene Dateiname der Wert wird$f
.Die Parametererweiterung arbeitet mit der
//
Bedeutung jedes Vorkommens des folgenden Zeichens//
(Leerzeichen in diesem Beispiel), sollte durch das Zeichen nach/
(in diesem Beispiel Unterstrich) ersetzt werden.quelle