2012-03-04 19 views
12

estaba revisando algunos de mi viejo código y me encontré con esta sintaxis, pero me olvido exactamente lo que significa :-)

extractDir="${downloadFileName%.*}-tmp" 

La única información que encontré búsqueda se refiere a una lista de comandos, pero esto es sólo una variable ¿Qué significa esta sintaxis de llavero en bash?

+3

Comience con * el completo * [Manual de referencia de BASH] (http://www.gnu.org/software/bash/manual/bashref.html) ... Está cubierto en [Expansión de parámetros] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion). (Las llaves significan otra cosa cuando * no * precedido con el símbolo '$'.) –

Respuesta

20

En este contexto, es parameter substitution.

El ${variable%.*} significa tomar el valor de $variable, quitarse el patrón .* de la cola del valor (mnemónico: por ciento tiene una 't' en la cola), y dar el resultado. (Por el contrario, ${variable#xyz} significa eliminar xyz de la cabeza del valor de la variable, porque (mnemónico) un Hash tiene una 'h' en la Cabeza.)

Dado:

downloadFileName=abc.tar.gz 
extractDir=abc.tar-tmp 

La notación alternativa:

extractDir=${downloadFileName%%.*} 

produce

abc-tmp 

El %% significa eliminar la cola más larga posible; de forma correspondiente, ## significa eliminar el cabezal más largo que coincida.

+0

¡Gracias por la respuesta completa! –

+0

@Shane: ¿Estás seguro? En Bash? Mi Bash 4.3 (4.3.27 (2)) con Mac en Mac OS X 10.10 casi parcheado no me gusta: 'downloadFileName = abc.tar.gz; echo $ {$ {downloadFileName # abc.}%. gz} 'genera:' bash-4.3: $ {$ {downloadFileName # abc.}%. gz}: bad substitution'. ¿Puedes especificar qué plataforma y qué versión de Bash? –

+0

En Zsh (** no Bash **), estos también se pueden anidar (es decir, $ {$ {downloadFilename # abc.}%. Gz} produce "tar"). Gracias @JonathanLeffler por la captura. – Shane

0

Se utiliza al expandir una variable de entorno adyacente a un texto que no es la variable, por lo que el shell no incluye todo en el nombre de la variable.

Cuestiones relacionadas