O que a barra dupla significa em `$ {f // / _}`?

17

Estou aprendendo Bash e quero substituir caracteres de espaço por outros caracteres "não em branco". Estou usando um forloop:

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

Minha pergunta é: por que estão a barra dupla e o espaço ${f// /_}? O que ${f// /_}faz?

Pretenderus
fonte
3
Se você não precisa aprender de cor, pelo menos deve saber onde ler sobre isso: está no manual do bash .
Glenn Jackman

Respostas:

19

Esse é um padrão de substituição usando a bashexpansão de parâmetros.

Em ${f// /_}:

  • As barras duplas //são para substituir todas as ocorrências de espaço por _, se você colocar uma barra /, apenas o primeiro espaço será substituído

  • O espaço existe porque você está substituindo o espaço (com sublinhado)

Portanto, o padrão é basicamente:

${parameter//find/replace}

Marque man bashpara ter mais ideia.

Para acessar a Parameter Expansionseção de man bashuma só vez:

LESS=+/'Parameter Expansion' man bash
heemail
fonte
2
Em suma, é uma pesquisa global e substitui.
Glenn Jackman
3

A seção "{f// /_}significa substituir todos os espaços com e sublinhado. Isso está usando a expansão do parâmetro Bash, a variável fdefinida no for f in *\ *;será executada para cada correspondência de expansão do shell (globbing). Cada vez que o nome do arquivo encontrado se tornará o valor $f.

A expansão do parâmetro funciona com o //significado de cada ocorrência do caractere a seguir //(espaço neste exemplo), deve ser substituída pelo caractere depois /(sublinhado neste exemplo).

Arronical
fonte