在bash中if条件中使用正则expression式

我不知道在bash中的if子句中使用正则expression式的一般规则?

这是一个例子

$ gg=svm-grid-ch $ if [[ $gg == *grid* ]] ; then echo $gg; fi svm-grid-ch $ if [[ $gg == ^....grid* ]] ; then echo $gg; fi $ if [[ $gg == ....grid* ]] ; then echo $gg; fi $ if [[ $gg == s...grid* ]] ; then echo $gg; fi $ 

为什么最后三个不匹配?

希望你能给出尽可能多的一般规则,而不仅仅是这个例子。

使用glob模式时,问号表示单个字符,星号表示零个或多个字符的序列:

 if [[ $gg == ????grid* ]] ; then echo $gg; fi 

使用正则expression式时,点表示单个字符,星号表示前面字符的零个或多个。 所以“ .* ”表示零个或多个字符,“ a* ”表示零个或多个“a”,“ [0-9]* ”表示零个或多个数字。 另一个有用的(在许多中)是代表一个或多个前面的字符的加号。 所以“ [az]+ ”表示一个或多个小写字母字符(在C语言环境中 – 以及其他一些字符)。

 if [[ $gg =~ ^....grid.*$ ]] ; then echo $gg; fi 

使用=〜

用于正则expression式检查正则expression式教程目录

 if [[ $gg =~ ^....grid.* ]] 

为那些对更便携的解决scheme感兴趣的用户(不依赖于bash版本)添加grep和基本sh内build的解决scheme;也可以在非Linux平台上使用简单的旧sh ,等等)

 # GLOB matching gg=svm-grid-ch case "$gg" in *grid*) echo $gg ;; esac # REGEXP if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi # Extended REGEXP if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then echo $gg fi 

一些grep化身也支持-q (quiet)选项作为redirect到/dev/null的替代scheme,但redirect又是最便携的。

@OP,

 Is glob pettern not only used for file names? 

不,“glob”模式不仅用于文件名。 你也可以使用它来比较string。 在你的例子中,你可以使用case / esac来查找string模式。

  gg=svm-grid-ch # looking for the word "grid" in the string $gg case "$gg" in *grid* ) echo "found";; esac # [[ $gg =~ ^....grid* ]] case "$gg" in ????grid*) echo "found";; esac # [[ $gg =~ s...grid* ]] case "$gg" in s???grid*) echo "found";; esac 

In bash, when to use glob pattern and when to use regular expression? Thanks!

正则expression式比“全局模式”更加通用和“方便”,但除非您正在执行的“混合/扩展匹配”无法轻松提供的复杂任务,否则不需要使用正则expression式。 正则expression式不支持版本的bash <3.2(如丹尼斯提到),但你仍然可以使用扩展的extglob (通过设置extglob )。 对于扩展globbing,请看这里和一些简单的例子。

更新OP:查找以2个字符开头的文件(点“。”表示1个字符),后跟“g”使用正则expression式

例如输出

 $ shopt -s dotglob $ ls -1 * abg degree ..g $ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done abg degree ..g 

在上面,文件是匹配的,因为它们的名字包含2个字符,后面跟着“g”。 (即..g )。

与globbing相当的将是这样的:(请参阅 ?*含义的参考 )

 $ for file in ??g*; do echo $file; done abg degree ..g