Was bedeutet der doppelte Schrägstrich in "$ {f // / _}"?

17

Ich lerne Bash und möchte Leerzeichen durch andere "nicht leere" Zeichen ersetzen. Ich benutze eine forSchleife:

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?

Pretenderus
quelle
3
Wenn Sie es nicht auswendig lernen müssen, sollten Sie zumindest wissen, wo Sie darüber lesen können: Es befindet sich im Bash-Handbuch .
Glenn Jackman

Antworten:

19

Das ist ein Ersatzmuster mit bashParametererweiterung.

In ${f// /_}:

  • Die doppelten Schrägstriche //ersetzen alle Vorkommen von Leerzeichen _. Wenn Sie einen Schrägstrich einfügen /, wird nur das erste Leerzeichen ersetzt

  • Das Leerzeichen ist da, weil Sie das Leerzeichen ersetzen (mit Unterstrich)

Das Muster ist also im Grunde:

${parameter//find/replace}

Überprüfen Sie man bash, um weitere Informationen zu erhalten.

Um sofort zum Parameter ExpansionAbschnitt von man bashzu gelangen:

LESS=+/'Parameter Expansion' man bash
heemayl
quelle
2
Kurz gesagt, es ist ein globales Suchen und Ersetzen.
Glenn Jackman
3

Der Abschnitt "{f// /_}bedeutet, dass jedes Leerzeichen durch einen Unterstrich ersetzt wird. Hierbei wird die Bash-Parametererweiterung verwendet. Die in fdefinierte Variable for 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.

Arronisch
quelle