bash - 最后一个特定字符后的表达式

too*_*oop 25 unix linux bash shell scripting

foo="/sdf/here/jfds"
bar="${foo##*/}"
Run Code Online (Sandbox Code Playgroud)

Canyone解释了" ${foo##*/}"表达式是如何工作的,因为我知道它将在最后一个正斜杠(即jfds)之后返回字符串,但我不知道它是如何做到的(或者这种类型的表达式被调用)?

Pet*_*r.O 39

它是几种shell特性之一,通常称为shell扩展.这种特殊的扩展称为参数扩展*.

您可以将此特定shell扩展形式视为左截断字符串函数.你必须使用如图所示的花括号(这不是可选的)..

当你只使用一个时#,它意味着只截断第一次出现的模式(直到结束}.当你使用两个时##,它意味着左截断所有连续的模式匹配.结果var="a/b/c"; echo ${var#*/}b/c... echo ${var##*/}返回 c.

有一个互补的右截断.它使用%而不是#...(我"记住"哪个是因为#它就像一个bash注释;总是在左边).

*被视为一个bash通配符扩展.

以下是以优先顺序显示的所有shell扩展的列表.

扩展的顺序是:

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  ]]
Run Code Online (Sandbox Code Playgroud)