Co oznacza podwójny ukośnik w `$ {f // / _}`?

18

Uczę się Bash i chcę zastąpić spacje innymi „niepustymi” znakami. Używam forpętli:

for f in *\ *; do mv "$f" "${f// /_}"; done

Moje pytanie brzmi: dlaczego jest podwójny ukośnik i spacja ${f// /_}? Co ma ${f// /_}zrobić?

Pretenderus
źródło
4
Jeśli nie musisz uczyć się tego na pamięć, powinieneś przynajmniej wiedzieć, gdzie o tym przeczytać: jest to w podręczniku bash .
glenn jackman

Odpowiedzi:

20

To zastępczy wzorzec przy użyciu bashrozszerzania parametrów.

W ${f// /_}:

  • Podwójne ukośniki //służą do zastąpienia wszystkich wystąpień miejsca _, jeśli wstawisz jedno ukośnik /, zastąpione zostanie tylko pierwsze miejsce

  • Spacja jest dostępna, ponieważ zastępujesz spację (podkreśleniem)

Więc wzór jest w zasadzie:

${parameter//find/replace}

Sprawdź, man bashaby uzyskać więcej pomysłów.

Aby Parameter Expansionod man bashrazu przejść do sekcji :

LESS=+/'Parameter Expansion' man bash
heemayl
źródło
3
Krótko mówiąc, jest to globalne wyszukiwanie i zamiana.
glenn jackman
4

Sekcja "{f// /_}oznacza zastąpienie każdej spacji znakiem podkreślenia. Używa to rozszerzenia parametrów Bash, zmienna fzdefiniowana w for f in *\ *;będzie przeprowadzana dla każdego dopasowania rozszerzenia powłoki (globbing). Za każdym razem znaleziona nazwa pliku stanie się wartością $f.

Rozszerzanie parametrów działa w ten //sposób, że każde wystąpienie następującego znaku //(spacja w tym przykładzie), powinno zostać zastąpione znakiem po /(podkreślenie w tym przykładzie).

Arroniczny
źródło