web-dev-qa-db-ja.com

bash-最後の特定の文字の後の式

foo="/sdf/here/jfds"
bar="${foo##*/}"

キャニオンは「${foo##*/} "式は、最後のスラッシュ(つまりjfds)の後に文字列を返すことを理解しているため機能しますが、どのように(またはこのタイプの式が何と呼ばれるか)わかりません。

30
toop

これは、一般的にシェル拡張と呼ばれるいくつかのシェル機能の1つです。この特定の展開は、パラメータ展開*と呼ばれます。

この特定のシェル拡張フォームは、left-truncate文字列関数と考えることができます。次のように中括弧を使用する必要があります(これはオプションではありません)。

_#_を1つだけ使用する場合は、次のパターンの最初のオカレンスのみを左切り捨てすることを意味します(最後の_}_まで。 2つの_##_を使用します。これは、左切り捨てすべての連続したパターン一致を意味します。_var="a/b/c"; echo ${var#*/}_の結果は_b/c_... _echo ${var##*/}_はcを返します。

補完的なright-truncateがあります。 _%_...の代わりに_#_を使用します(_#_はbashコメントのようなものであるため、常に左側にあります)。

_*_は、bashワイルドカード展開として扱われます。

これは、すべてのシェル拡張のリストであり、優先順位で示されています。

拡張の順序は次のとおりです。

_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  ]]
_
34
Peter.O