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ć?
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ć?
Odpowiedzi:
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
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).