在 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 。
参见本书
- 本章的 使用正则表达式替换 一节