Что означает двойной слеш в `$ {f // / _}`?

17

Я изучаю Bash и хочу заменить символы пробела другими "непустыми" символами. Я использую forцикл:

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

Мой вопрос: почему двойная косая черта и пространство в ${f// /_}? Что делает ${f// /_}?

Pretenderus
источник
3
Если вам не нужно изучать это наизусть, вы должны хотя бы знать, где об этом прочитать: это в руководстве по bash .
Гленн Джекман

Ответы:

19

Это шаблон замены с использованием bashрасширения параметров.

В ${f// /_}:

  • Двойная косая черта //предназначена для замены всех вхождений пробела на _: если поставить одну косую черту /, будет заменена только первая пробел

  • Там есть место, потому что вы заменяете пространство (подчеркиванием)

Итак, шаблон в основном такой:

${parameter//find/replace}

Проверьте, man bashчтобы получить больше идей.

Чтобы попасть в Parameter Expansionраздел man bashсразу:

LESS=+/'Parameter Expansion' man bash
heemayl
источник
2
Короче говоря, это глобальный поиск и замена.
Гленн Джекман
3

Раздел "{f// /_}означает заменить каждый пробел с подчеркиванием. Это использует расширение параметра Bash, переменная, fопределенная в переменной, for f in *\ *;будет проходить при каждом совпадении расширения оболочки (globbing). Каждый раз, когда найденное имя файла становится значением $f.

Расширение параметра работает со //значением каждого вхождения следующего символа //(пробел в этом примере), должен быть заменен символом после /(подчеркивание в этом примере).

Arronical
источник