Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 模式匹配操作符之间有什么区别?_Bash_Pattern Matching_Sh - Fatal编程技术网

Bash 模式匹配操作符之间有什么区别?

Bash 模式匹配操作符之间有什么区别?,bash,pattern-matching,sh,Bash,Pattern Matching,Sh,我有一些关于模式匹配操作符的问题 这些例子之间有什么区别 $ VAR=/usr/bin/iecset $ echo ${VAR#*/} usr/bin/iecset 及 及 及 这里的“模式”是一个glob或扩展glob模式——大多数人称之为通配符。这些字符与正则表达式中使用的字符具有不同的含义。所以*表示“任何字符的零个或多个” 你的例子: (使用大写变量名是个坏主意) 提示: 要从左侧删除,左侧将显示* #从左侧删除,因为#在“We are#1”中位于左侧 %从右侧删除,因为%位于右侧

我有一些关于模式匹配操作符的问题

这些例子之间有什么区别

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

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

你的例子:

(使用大写变量名是个坏主意)

提示:

  • 要从左侧删除,左侧将显示
    *
  • #
    从左侧删除,因为
    #
    在“We are#1”中位于左侧
  • %
    从右侧删除,因为
    %
    位于右侧的50%
  • var=/usr/bin/iecset

    删除以中结尾的左侧最短字符串/

    echo ${var#*/}
    usr/bin/iecset
    
    echo ${var##*/}
    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)
    
    删除右侧以开头的最长字符串/

    var=/usr/bin/iecset
    echo ${var%/*}
    /usr/bin
    
    echo ${var%%/*}
    
    (blank line)
    

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

    Bash手册中没有清楚地解释这一区别吗?我可以发布一个答案,但我基本上只是引用手册中的内容。如果您不确定文档记录在哪里,请参阅Thank@Barmar我没有在文档中搜索,我看了这节课,但不明白