您的位置:首页 > 运维架构

puppet自动化运维之运算符及正则表达式

2014-05-19 00:00 507 查看
摘要: 个人近期将发布puppet自动化运维的亲身实战,有很多来之网上的文档,特别是http://kisspuppet.com和《Puppet实战》的。此次推出puppet的运算符及正则表达式,欢迎网友指正。

有复杂的表达式的时候要注意使用括号()。

1.算数运算符:

操作符描述实例
+加法$a=5 + 3
file {"/tmp/temp6.txt":
content => "$a",
} 8
-减法$a=5 - 3
file {"/tmp/temp6.txt":
content => "$a",
} 2
*乘法$a=5 * 3
file {"/tmp/temp6.txt":
content => "$a",
} 15
/除法$a=5 / 3
file {"/tmp/temp6.txt":
content => "$a",
} 1
**报错(*)
%取余报错(%)
注:

(1)乘幂的基数不能为负,如 (-5) ** 2.5 # error;
(2)乘幂结果不能超出计算机表示的限制,如10 ** 999999 # error

(3)取余的操作数如不是整数,四舍五入成整数后运算;运算符右侧不能为零

(4)单目负可用于变量: - $y ; # 等效于 $y * -1

(5)对应有 +=、-=、*=、/=、**=、%=

2.整数比较运算符:

一般用于if语句,同shell。

操作符描述实例
< 小于if 6 < 7 { $a=" 6 < 7 is true"} else { $a="6 < 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 < 7 is true
> 大于if 6 > 7 { $a=" 6 > 7 is true"} else { $a="6 > 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 > 7 is false
==等于if 6 == 7 { $a="6 == 7 is true"} else { $a="6 == 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 == 7 is false
<=小于等于if 6 <= 7 { $a="6 <= 7 is true"} else { $a="6 <= 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 <= 7 is true
>=大于等于if 6 >= 7 { $a="6 >= 7 is true"} else { $a="6 >= 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 >= 7 is false
!=不等于if 6 != 7 { $a="6 != 7 is true"} else { $a="6 != 7 is false"}file {"/tmp/temp6.txt": content => "$a",} 6 != 7 is true
<=>比较,返回1,0,-10 : 两个值相等 1 :第一个值大 -1 : 第二个值大

3.字符串比较运算符:

字符串比较函数 eq、ne、cmp、lt、gt、le、ge,使用cmp就好。绝不能用'==',要用eq,正确的做法是:不论整形Perl字符串,都用eq或ne。

符号范例说明
gt$str1 gt $str2如果$str1大于$str2返回1否则返回0
ge$str1 ge $str2如果$str1大于等于$str2返回1否则返回0
lt$str1 lt $str2如果$str1小于$str2返回1否则返回0
le$str1 le $str2如果$str1小于等于$str2返回1否则返回0
eq$str1 eq $str2如果$str1等于$str2返回1否则返回0
ne$str1 ne $str2如果$str1不等于$str2返回1否则返回0
cmp$str1 cmp $str2如果$str1大于$str2返回1;如果$str1=$str2返回0;如果$str1小于$str2则返回-1
$str1=”a”,$str2=”a“,则print ($str1 cmp $str2) ==> 0

$str1=”a”,$str2=”b”,则print($str1 cmp $str2)===> -1

$str1=”b”,$str2=”a”,则print($str1 cmp $str2)===> 1

4.逻辑运算符:

操作符描述实例
||、or与(||报错)if (7 == 9) or (8 == 8) {
$a="It is true"
} else {
$a="It is false"
}
file {"/tmp/temp6.txt":
content => "$a",
} It is true
&&、and或(&&报错)if (7 == 7) and (8 == 8) {
$a="It is true"
} else {
$a="It is false"
}
file {"/tmp/temp6.txt":
content => "$a",
} It is true
!、not非(not报错)if !(7 == 9) {
$a="It is true"
} else {
$a="It is false"
}
file {"/tmp/temp6.txt":
content => "$a",
} It is true

5.文件运算符:

和逻辑运算符连用。

注:文件运算符有问题,无论是否存在,都返回,存在,想要能使用,需要和逻辑非(!),连用。

参数描述实例
-d $path如果$path是一个目录,返回1if ! "-d /roots" { $a="is a file !!!"} else { $a="is not a file !!!"}file {"/tmp/temp6.txt": content => "$a",}
-f $file如果$file是一个文件,返回1
-e $file如果$file是存在,返回1
-r $file如果$file是可读取,返回1
-w $file如果$file是可写入,返回1
-x $file如果$file是可执行,返回1
-b $file如果$file是binary文件,返回1

6.正则表达式:

正则表达式有两种存在形式:匹配和替换

puppet中,正则表达式主要用来做匹配。
puppet把斜线之间的文本当作正则表达式。
如何使用正则表达式来匹配:

格式:

字符串 =~ /正则表达式/ #匹配 字符串 !~ /正则表达式/ #不匹配
注:perl的正则表达式以斜杠【/】包含。

特殊字符,同shell。

元字符
功能
示例
示例的匹配对象
^
行首定位符
/^love/
匹配所有以love开头的行
$
行尾定位符
/love$/
匹配所有以love结尾的行
.
匹配除换行符外的单个字符
/l..e/
匹配包含字母l、后跟两个任意字符、再跟字母e的行
*
匹配零个或多个前导字符
/ *love/
匹配在零个或多个空格紧跟着模式love的行
[]
匹配指定字符组内的任一字符
[xyz]
将会匹配字符x, y, 或z.
[c-n]
匹配字符c到字符n之间的任意一个字符.
[B-Pk-y]
匹配从B到P, 或者从k到y之间的任意一个字符.
[a-z0-9]
匹配任意小写字母或数字.
[^b-d]
将会匹配范围在b到d之外的任意一个字符. 这就是使用^对字符集取反的一个实例.
[Yy][Ee][Ss]
能够匹配yes, Yes, YES, yEs
/[Ll]ove/
匹配包含love和Love的行
+
匹配一个或多个前导符
[a–z]+ove

匹配一个或多个小写字母,后面跟着ove,如approve, love, behoove
?
匹配零个或一个前导符
lo?ve
匹配lve或这love
a|b
匹配a或b
love|hate
匹配love或者hate
(…)
匹配一组字符
love(able|ly)
(ov)+
匹配loveable或者lovely.
匹配一个或多个ov
\(…\)
保存已匹配的字符
s/\(love\)able/\1er/
标记元字符之间的模式,并将其保存为标签1,之后可以用\1来引用它。最多可定义9个标签,从左边开始编号,最左边的是第一个。在这个示例中,love被保存在寄存器1里,之后被替换串引用,结果loveable被替换为lover
x\{m\}
连续m个x
/o\{5\}/
分别匹配出现连续5个字母o、至少5个连续的o、或5—10个连续的o的行
x\{m,\}
至少m个x
/o\{5,\}/
x\{m,n\}
至少m个、但不超过n个x
/o\{5,10\}/

①.实例:

vi file.pp
$string="Hello fufangchun ,my english name is perofu!!!"
if $string =~ /[hH]ello/ {
$a="I get it!!!"
} else {
$a="I did not get it!!! "
}

file {"/tmp/temp6.txt":
content => "$a",
}

#
[root@client ~]# cat /tmp/temp6.txt
cat: /tmp/temp6.txt: No such file or directory
[root@client ~]# puppet agent -vv --test --server master.perofu.com
info: Caching catalog for client.perofu.com
info: Applying configuration version '1395163673'
notice: /Stage[main]//File[/tmp/temp6.txt]/ensure: defined content as '{md5}eed05ef64624b7d7ea7595e1e5d079d1'
notice: Finished catalog run in 0.02 seconds
[root@client ~]# cat /tmp/temp6.txt
I get it!!!
至此,puppet的运算符及正则表达式就结束了,接下来的是条件语句的学习,请听下回分解!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息