在 if 语句中使用正则表达式
优质
小牛编辑
135浏览
2023-12-01
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 。
参见本书
本章的 使用正则表达式替换 一节