2009-02-11 9 views
9

Tengo una parte de un script bash que está obteniendo un nombre de archivo sin extensión, pero estoy tratando de entender qué está pasando realmente aquí. ¿Para qué son los "%%"? ¿Puede alguien explicar qué está haciendo bash detrás de escena? ¿Cómo se puede usar esta técnica de forma general?¿Utiliza esta técnica de extracción de nombre de archivo bash?

#!/bin/bash 

for src in *.tif 
    do 
    txt=${src%%.*} 
    tesseract ${src} ${txt} 
    done 
+1

Tenga en cuenta que %% eliminará todo el '.' en el nombre del archivo, no solo la llamada extensión. Por ejemplo, si tuviera hello.world.tif y hello.death.tif, ambos tendrían tesseract enviándolos al mismo destino, hola. Si desea eliminar solo una extensión, use%. – johnny

+0

Porque en el caso de múltiples "." S en el nombre de archivo que desea buscar y tira del "patrón de coincidencia más corto" del lado derecho de la cadena. Tiene sentido para mi. Entonces, en el caso de mi script anterior, debería cambiarlo a "%". Se supone que esto elimina las extensiones de los nombres de los archivos. – jjclarkson

Respuesta

15

Se deshace de la extensión (aquí: .tif), la muestra:

$ for A in test.py test.sh test.xml test.xsl; do echo "$A: ${A%%.*}"; done 
test.py: test 
test.sh: test 
test.xml: test 
test.xsl: test 

del manual de bash:

${parameter%%word} 
      The word is expanded to produce a pattern just as in pathname expansion. If the 
      pattern matches a trailing portion of the expanded value of parameter, then the 
      result of the expansion is the expanded value of parameter with the shortest 
      matching pattern (the ``%'' case) or the longest matching pattern (the ``%%'' 
      case) deleted. If parameter is @ or *, the pattern removal operation is applied 
      to each positional parameter in turn, and the expansion is the resultant list. 
      If parameter is an array variable subscripted with @ or *, the pattern removal 
      operation is applied to each member of the array in turn, and the expansion is 
      the resultant list. 
+1

A partir de su ejemplo, puedo comenzar a ver cuán poderoso bash puede ser desde la línea de comando. ¡Gracias! – jjclarkson

1

Consulte "Expansión de parámetros" en las páginas de manual de bash. Esa sintaxis expande la variable $ src borrando cosas que coinciden con el patrón. *.

+0

Gracias, no me di cuenta de que las páginas de bash man eran tan extensas. – jjclarkson

4

Aquí está la salida desde la página de manual de bash

${parameter%%word} 
      The word is expanded to produce a pattern just as in pathname 
      expansion. If the pattern matches a trailing portion of the 
      expanded value of parameter, then the result of the expansion is 
      the expanded value of parameter with the shortest matching pat- 
      tern (the ``%'' case) or the longest matching pattern (the 
      ``%%'' case) deleted. If parameter is @ or *, the pattern 
      removal operation is applied to each positional parameter in 
      turn, and the expansion is the resultant list. If parameter is 
      an array variable subscripted with @ or *, the pattern removal 
      operation is applied to each member of the array in turn, and 
      the expansion is the resultant list. 
1

Es una operación de eliminación de cadenas en para mat: ${str%%substr}

Donde str es la cadena en la que está trabajando, y substr es el patrón que coincide. Busca la coincidencia más larga de substr en str y elimina todo a partir de ese punto.

3

Al parecer fiesta tiene varias herramientas "expansión de parámetros", que incluyen:

simplemente sustituyendo el valor ...

${parameter} 

La expansión a una subcadena ...

${parameter:offset} 
${parameter:offset:length} 

Sustituya la longitud del valor de los parámetros ...

${#parameter} 

Ampliando un partido en el principio del parámetro ...

${parameter#word} 
${parameter##word} 

Ampliando un partido al final del parámetro ...

${parameter%word} 
${parameter%%word} 

amplía el parámetro de encontrar y reemplazar una cadena ...

${parameter/pattern/string} 

Estas son mi interpretación de las partes que creo que entiendo de esta sección de las páginas man. Avíseme si me perdí algo importante.

+0

Simplemente date cuenta de que hay una diferencia ligeramente sutil entre # y ## y% y %%. Estas expansiones tampoco entienden los nombres de archivo. – johnny

Cuestiones relacionadas