当前位置: 首页 > 面试题库 >

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

别兴国
2023-03-14
问题内容
foo="/sdf/here/jfds"
bar="${foo##*/}"

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


问题答案:

它是外壳程序的几种功能之一,通常称为 外壳扩展 。这种特定的 扩展 称为 参数 扩展*。

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

如果仅使用一个#,则表示仅左截断随后出现的模式的 第一个 匹配项(直到结束}。使用两个时##,表示左截断 所有
连续的模式匹配。的结果var="a/b/c"; echo ${var#*/}b/cecho ${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  ]]


 类似资料:
  • 我目前拥有的正则表达式是: 它捕获了其中一个“.”(第1组)第2-4组为空 或: 一组小写、点、破折号。以小写字母开头(第2组) ——后跟可选星号(第3组) ——后跟方括号内的可选内容(第4组) 我有两个问题,第一个是让第二组必须以字母结尾,我尝试了很多方法,包括: 能杀死3-4组的任何生物 这似乎没什么不同 我遇到的另一个问题是组4,它不依赖于方括号(这是有意义的,因为我有*字符为他们)...但

  • 问题内容: 以下代码段发出编译时错误。 第二行的错误是: 该错误消息基于NetBeans IDE。 如下声明该字符时。 编译时错误消失。 与最终字符串的情况无关 什么是修改有所作为吗? 问题答案: 原因是JLS#5.2(分配转换)如此表示: 如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节),则当变量的类型为byte,short或char且常量表达式的值时,可

  • 本文向大家介绍去除字符串中最后一个指定的字符相关面试题,主要包含被问及去除字符串中最后一个指定的字符时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 在我的应用程序中,我将附加一个字符串以创建路径以生成URL。现在,我想在按“后退”按钮时删除该附加字符串。 假设这是字符串: 现在我想要一个这样的字符串: 我怎样才能做到这一点? 问题答案: 您可以使用相同的方法

  • 问题内容: 当您必须遍历一个集合并用分隔符分隔每个数据的字符串时,总是总是在末尾有一个额外的分隔符,例如 给出类似以下内容: serverId_1,serverId_2,serverId_3, 我想删除StringBuilder中的最后一个字符(不进行转换,因为在此循环之后我仍然需要它)。 问题答案: 其他人指出了该方法,但这是另一种替代方法: 或者,使用Guava中的类:) 从Java 8开始,

  • 这工作正常,所以如果歌曲名称是这是*名称,它将创建别名。但是,如果名称在开头或结尾有特殊字符它将创建 - 在两端创建连字符。