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/