foo="/sdf/here/jfds" bar="${foo##*/}"
Canyone解释了“ ${foo##*/}”表达式的工作原理,因为我知道它会在最后一个正斜杠(即jfds)之后返回字符串,但是我不知道它是如何执行的(或这种类型的表达式称为)?
${foo##*/}
它是外壳程序的几种功能之一,通常称为 外壳扩展 。这种特定的 扩展 称为 参数 扩展*。
您可以将这种特殊的Shell扩展形式视为 左截断 字符串函数。您必须使用如图所示的花括号(这不是可选的)。
如果仅使用一个#,则表示仅左截断随后出现的模式的 第一个 匹配项(直到结束}。使用两个时##,表示左截断 所有 连续的模式匹配。的结果var="a/b/c"; echo ${var#*/}是b/c… echo ${var##*/}返回 c。
#
}
##
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 ]]