在 if 语句中使用正则表达式

Some people, when confronted with a problem think; I know, I’ll use regular expressions. Now they have two problems.

— Jamie Zawinski

你可以在 if 语句中使用另一种类型的表达式,即 正则表达式regular expression)。 正则表达式是一种使用模式匹配的强大的字符串比较方式。

操作步骤

在你的配置清单中添加如下代码:

if $lsbdistdescription =~ /LTS/ {
    notice("Looks like you are using a Long Term Support version of
 Ubuntu.")
} else {
    notice("You might want to upgrade to a Long Term Support version
 of Ubuntu...")
}

工作原理

Puppet 将两个斜线之间的文本当做正则表达式对待,两个各斜线之间的文本就是要匹配的内容。 如果正则表达式匹配成功,if 表达式为真,第一个大括号之间的代码就会被执行。

若要使用匹配的反逻辑,即不匹配,需要使用 !~ 替代 =~ ,例如:

if $lsbdistdescription !~ /LTS/ {

更多用法

正如 Jamie Zawinski 指出的,正则表达式虽然强大,但难于理解和调试。 如果你发现自己所写的正则表达式相当复杂,以至于一眼看上去不能被理解, 就应该考虑简化设计使正则表达式更易懂。 然而,正则表达式的一个特别有用的功能是能够捕获模式。

捕捉模式

你不仅可以使用正则表达式匹配文本,还可以捕获匹配的文本并将其存储在变量中:

$input = "Puppet is better than manual configuration"
if $input =~ /(.*) is better than (.*)/ {
    notice("You said '$0'. Looks like you're comparing $1 to $2!")
}

结果为:

You said 'Puppet is better than manual configuration'. Looks like you're
comparing Puppet to manual configuration!

变量 $0 存储了所有匹配的文本(假设整体匹配成功)。 如果你将一部分正则表达式置于一对圆括号中,就会创建一个 group), 并且所有被匹配的组都会存储在变量中。 第一个被匹配的组是 $1,第二个是 $2,以此类推,正如上例展示的那样。

正则表达式语法

Puppet 使用了 Ruby 正则表达式语法(Regular expression syntax)的一个子集,如果你还不熟悉正则表达式, 下面网址中的解释会对你有用: http://gnosis.cx/publish/programming/regular_expressions.html

参见本书