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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9532654/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 04:56:48  来源:igfitidea点击:

bash - expression after last specific character

linuxbashshellunixscripting

提问by toop

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

Canyone explain how the "${foo##*/}" expression works because I understand it will return the string after the last forward slash (ie jfds) but I have no idea how it does it (or what this type of expression is called)?

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

采纳答案by Peter.O

It is one of several shell features, generically called shell expansion. This particular expansionis called parameterexpansion*.

它是多个 shell 功能之一,通常称为shell 扩展。这种特殊的扩展称为参数扩展*。

You can think of this particular shell expansion form as a left-truncatestring function. You must use the curly braces as shown (that is not optional)..

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

When you use only one #, it means left-truncate only the firstoccurrence of the pattern which follows (up to the closing }. When you use two ##, it means left-truncate allconsecutive pattern-matches. The result of var="a/b/c"; echo ${var#*/}is b/c... echo ${var##*/}returns c.

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

There is a complementary right-truncate. It uses %instead of the #... (I "remember" which is which because #is like a bash comment; always on the left).

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

The *is treated as a bash wildcard expansion.

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

Here is a list of all shell expansions, presented in precedence order.

这是所有 shell 扩展的列表,按优先顺序显示。

The order of expansions is:

展开顺序为:

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  ]]