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

标签 linux bash shell unix scripting

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

谁能解释一下“${foo##*/}”表达式是如何工作的?我知道它将在最后一个正斜杠(即 jfds)之后返回字符串。但是,我不知道它是如何工作的,也不知道这种类型的表达式叫什么?

最佳答案

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

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

当您只使用一个 # 时,这意味着仅左截断紧随其后的模式的 第一次 出现(直到结束 }。当你使用两个##时,它意味着左截断所有连续的模式匹配。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  ]]

关于linux - 最后一个特定字符后的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9532654/

相关文章:

linux - Bash 脚本解析 HTML 文件

linux - 使用环境变量(从 awk 命令获取其值)作为 while 中的条件

linux - 将程序的输出日志传递给函数,同时将返回码存储在变量中

Linux:提取文件的第一行

shell - 使用 AWK 合并两个数据集

c - shell c 中的输入输出重定向

linux - 为什么 gtkmm 有时会自动创建第二个线程?

linux - 如何从驱动程序的 ioctl() 中的文件对象中获取 pci_dev?

linux - 在 bash 中取消失败的反向搜索,但保留我输入的内容

linux - 在 bash 中的两个非常 'different' 位置之间移动文件