模式匹配运算符之间有什么区别?

时间:2016-07-01 00:13:54

标签: bash pattern-matching sh

我对模式匹配运算符有一些疑问。

这些例子之间的区别

$ VAR=/usr/bin/iecset
$ echo ${VAR#*/}
  usr/bin/iecset

$ VAR=/usr/bin/iecset
$ echo ${VAR##*/}
  iecset

$ VAR=/usr/bin/iecset
$ echo ${VAR%*/}
  /bin/iecset

$ VAR=/usr/bin/iecset
$ echo ${VAR%%*/}

1 个答案:

答案 0 :(得分:0)

"模式"这是一个 glob 扩展的glob 模式 - 大多数人称它们为通配符。这些字符与正则表达式中使用的字符具有不同的含义。所以*表示"零个或多个任何字符"。

${var#pattern}    # delete shortest match of pattern from left
${var##pattern}   # delete longest match of pattern from left 
${var%pattern}    # delete shortest match of pattern from right 
${var%%pattern}   # delete longest match of pattern from right 

您的示例:

(使用大写变量名称的好主意)

提示:

  1. 从左侧删除,*位于左侧。
  2. #从左侧删除,因为#位于&#34左侧;我们是#1"
  3. %从右侧删除,因为%位于右侧50%
  4. var=/usr/bin/iecset

    删除左侧最短的字符串,以

    结尾
    echo ${var#*/}
    usr/bin/iecset
    

    第一个/左边没有字符,请记住*表示或更多。所以最左边的/被删除了。

    删除左侧最长的字符串,以/

    结尾
    echo ${var##*/}
    iecset
    

    你的帖子中接下来的两个错了!要从右侧删除,*应位于/.

    的右侧
    $ echo ${VAR%*/}      # WRONG
    $ echo ${VAR%%*/}     # WRONG
    

    我认为你的意思是:

    从/

    开始删除右侧最短的字符串
    var=/usr/bin/iecset
    echo ${var%/*}
    /usr/bin
    

    删除右侧最长的字符串,以/

    开头
    echo ${var%%/*}
    
    (blank line)
    

    除了*之外,您还可以使用许多其他元字符。