2012-03-02 9 views
12
foo="/sdf/here/jfds" 
bar="${foo##*/}" 

Canyone explicar cómo funciona el "${foo##*/}" expresión porque entiendo que devolverá la cadena después de la última barra inclinada (es decir jfds) pero no tengo ni idea de cómo lo hace (o ¿cómo se llama este tipo de expresión?fiesta - expresión después del último carácter específico

+1

Se llama [expansión de parámetro] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion). El enlace también explica "cómo funciona", es decir, describe lo que hace. ¿O tienes una pregunta más específica al respecto? –

Respuesta

22

Es una de varias características de shell, genéricamente llamada shell expansion. Esta expansión particular se llama parámetro expansión *.

Puede pensar en este formulario de expansión de shell en particular como una función de cadena truncado a la izquierda. Debe utilizar las llaves como se muestra (que no es opcional) ..

Cuando se utiliza un solo #, significa izquierda-truncado solamente la ocurrencia primera del patrón que sigue (hasta el cierre }. al utilizar dos ##, significa izquierda-truncar todos Patronistas partidos consecutivos. El resultado de var="a/b/c"; echo ${var#*/} es b/c ... echo ${var##*/} vuelve c.

Hay una complementaria derecha truncar. se utiliza en lugar % o f el # ... ("recuerdo" que es porque # es como un comentario bash; siempre a la izquierda).

El * se trata como una expansión de comodín bash.

Aquí hay una lista de todas las expansiones de shell, presentadas en orden de precedencia.

El orden de las expansiones es:

1. brace expansion ... prefix{-,\,}postfix    # prefix-postfix prefix,postfix 
        .. {oct,hex,dec,bin}    # oct hex dec bin 
        . {a..b}{1..2}     # a1 a2 b1 b2 
        . {1..04}       # 01 02 03 04 
        . {01..4}       # 01 02 03 04 
        . {1..9..2}      # 1 3 5 7 9 
        . \$\'\\x{0..7}{{0..9},{A..F}}\' # $'\x00' .. $'\x7F'  

2. tilde expansion .... ~   # $HOME 
        ... ~axiom  # $(dirname "$HOME")/axiom 
        ... ~fred  # $(dirname "$HOME")/fred 
        .. ~+   # $PWD  (current working directory) 
        .. ~-   # $OLDPWD (previous working directory. If OLDPWD is unset, 
                 ~- is not expanded. ie. It stays as-is, 
                  regardless of the state of nullglob.) 
            # Expansion for Directories in Stack. ie. 
            # The list printed by 'dirs' when invoked without options 
         . ~+N   # Nth directory in 'dirs' list (from LHS) 
         . ~-N   # Nth directory in 'dirs' list (from RHS) 

3. parameter expansion .... ${VAR/b/-dd-} 
         ... ${TEST_MODE:-0} 
         .. ${str: -3:2} # note space after : 
          . ${#string} 

4. (processed left-to-right) 
    variable expansion 
    arithmetic expansion 
    command substitution 

▶5. word splitting   # based on $IFS (Internal Field Seperator) 

▷6. pathname expansion 
     according to options such as: 
     nullglob, GLOBIGNORE, ...and more 

# Note: =============== 
▶ 5. word splitting  ↰ 
▷ 6. pathname expansion ↰ 
# ===================== ↳ are not performed on words between [[ and ]] 
Cuestiones relacionadas