¿Qué significa la barra doble en `$ {f // / _}`?

17

Estoy aprendiendo Bash, y quiero reemplazar los caracteres de espacio con otros caracteres "no en blanco". Estoy usando un forbucle:

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

Mi pregunta es, ¿por qué están el doble corte y el espacio ${f// /_}? ¿Qué ${f// /_}hacer?

Pretendiente
fuente
3
Si no necesita aprenderlo de memoria, al menos debe saber dónde leerlo: está en el manual de bash .
Glenn Jackman

Respuestas:

19

Eso es un patrón de reemplazo usando la bashexpansión de parámetros.

En ${f// /_}:

  • Las barras diagonales dobles //son para reemplazar todas las apariciones de espacio con _, si coloca una barra inclinada /, solo se reemplazará el primer espacio

  • El espacio está ahí porque está reemplazando el espacio (con guión bajo)

Entonces el patrón básicamente es:

${parameter//find/replace}

Comprueba man bashpara tener más idea.

Para llegar a la Parameter Expansionsección de man bashuna vez:

LESS=+/'Parameter Expansion' man bash
heemayl
fuente
2
En resumen, es una búsqueda y reemplazo global .
Glenn Jackman
3

La sección "{f// /_}significa reemplazar cada espacio con y subrayar. Esto está utilizando la expansión del parámetro Bash, la variable fdefinida en el for f in *\ *;se ejecutará para cada coincidencia de expansión de shell (globbing). Cada vez que el nombre de archivo encontrado se convertirá en el valor $f.

La expansión de parámetros funciona con el //significado de que cada aparición del siguiente carácter //(espacio en este ejemplo), debe reemplazarse por el carácter posterior /(subrayado en este ejemplo).

Arronico
fuente