iRules 101-#02-if和表达式
2020-11-09 18:40:29
CUNHUI
原文链接: https://devcentral.f5.com/s/articles/irules-101-02-if-and-expressions
if
命令用于根据特定条件执行脚本。本文将讨论
if
命令的使用规则以及有关
TCL
表达式的格式和使用的详细信息。
- - if 命令将expr1 视为表达式(与expr 计算其参数的方式相同)。
- - 表达式的值必须是布尔值(一个数字值,其中 0 为 false ,其他值为 true ,或者一个字符串值,例如 true 或 yes 表示 true , false 或 no 表示 false );如果为 true ,则将 body1 传递给 TCL 解 释器来执行。否则,将 expr2 作为表达式求值,如果为 true ,则执行 body2 ,依此类推。
- - 如果所有表达式的计算结果都不为 true ,则执行 bodyN 。
- - then 和 else 参数是可选的“干扰词”,以使命令更易于阅读。
- - 可能有任意数量的 elseif 子句,包括 0 个。
- - BodyN 也可以省略,只要 else 也忽略。
- - 该命令的返回值是执行的主体脚本的结果,如果所有表达式没有非零且没有 bodyN , 则返回一个空字符串。





-
- Tcl
表达式由操作数,运算符和括号的组合组成。
-
- 操作数、运算符和括号之间可以使用空格;表达式的指令会忽略它。
-
- 在可能的情况下,操作数被解释为整数值。
-
- 整数值可以以十进制(通常情况下),八进制(如果操作数的第一个字符为
0
)或十六进制(如果操作数的前两个字符为
0x
)指定。
-
- 如果一个操作数不具有上面给出的整数格式之一,则在可能的情况下将其视为浮点数。
-
- 浮点数可以通过符合
ANSI
的
C
编译器接受的任何方式指定(除了在大多数安装中不允许使用
f
,
F
,
l
和
L
后缀)。例如,以下所有都是有效的浮点数:
2.1
、
3
、
6e4
、
7.91e + 16
。
-
- 如果无法进行数字解释(请注意,所有非数字或布尔值的文字操作数都必须用大括号或双引号引起来),则操作数将作为字符串保留(并且只能对其应用有限的一组运算符)。
操作数
可以通过以下任何一种方式指定操作数:
-
1、作为数值,可以是整数或浮点数。
-
2、作为布尔值,使用字符串理解的任何形式都是布尔值。
-
3、作为一个
Tcl
变量,使用标准
$
表示法。变量的值将用作操作数。
-
4、作为用双引号引起来的字符串。表达式解析器将对引号之间的信息执行反斜杠,变量和命令替换,并将结果值用作操作数
-
5、如用大括号括起来的字符串。大括号和匹配的大括号之间的字符将用作操作数,而不会进行任何替换。
-
6、作为括在方括号中的
Tcl
命令。命令将被执行,其结果将被用作操作数。
-
7、作为一种数学函数,其参数具有上述操作数的任何形式,例如
abs
(
$ x
)
。有关定义的功能的列表,请参见下文。
-+
〜
!
一元减,一元加,按位非,逻辑非。这些运算符均不能应用于字符串操作数,而按位非运算仅可以应用于整数。
* /
%
乘,除,余数。这些运算符均不能应用于字符串操作数,余数只能应用于整数。余数将始终与除数具有相同的符号,并且绝对值小于除数。
+-
加和减。对任何数值操作数有效。
<< >>
左右移位。仅对整数操作数有效。
右移总是传播符号位。
<> <=> =
布尔小于、大于、小于或等于、大于或等于。如果条件为真,则每个运算符生成
1
,否则为0
。这些运算符可以应用于字符串以及数值操作数,当使用字符串比较时。
==
!
=
布尔等于和不等于。每个运算符产生
0/1
结果。对所有操作数类型有效。
eq ne
布尔字符串等于和字符串不相等。每个运算符产生
0/1
结果。操作数类型仅解释为字符串。
&
按位与。仅对整数操作数有效。
^
按位异或。仅对整数操作数有效。
|
按位或。仅对整数操作数有效。
&&
逻辑与。如果两个操作数都不为零,则结果为
1
,否则为
0
。仅对布尔和数字(整数或浮点数)操作数有效。
||
逻辑或。如果两个操作数均为零,则产生
0
结果,否则为
1
。仅对布尔和数字(整数或浮点)操作数有效。
x
?y:z
C
语言中的
If-then-else
。如果
x
的
取值为非零,则结果为
y
的值。否则,结果为
z
的值。
x
操作数必须具有布尔值或数字值。
除了核心
TCL
语言中的运算符外,
iRules
中还添加了以下运算符:
contains
测试一个字符串是否包含另一个字符串。
ends_with
测试一个字符串是否以另一字符串结尾。
equals
测试一个字符串是否等于另一个字符串。
matches
测试一个字符串是否包含第二个字符串的匹配项。
matchs_regex
测试一个字符串是否匹配给定的正则表达式。
starts_with
测试一个字符串是否以另一字符串开头。
and
逻辑与(
&&
)的用户友好等效项。
not
逻辑非(!)的用户友好等效项。
or
逻辑或( || )的用户友好等效项。
abs
(
arg
)
返回
arg
的绝对值。
Arg
可以是整数,也可以是浮点数,结果以相同的形式返回。
double
(
arg
)
如果
arg
是浮点值,则返回
arg
,否则将
arg
转换为浮点并返回转换后的值。
int
(
arg
)
如果
arg
是与机器字相同宽度的整数值,返回
arg
,否则通过截断将
arg
转换为整数并返回转换后的值。
rand
()
返回值的范围(伪随机浮点值
0
,
1
)。生成器算法是简单的线性同余生成器,该生成器算法在密码学上不安全。
rand
的
每个结果完全决定了后续对
rand
的
调用的所有将来结果,因此
rand
不适合生成一系列机密信息,例如一次性密码。生成器的种子从机器的内部时钟初始化,或者可以使用
srand
函数进行设置。
round
(
arg
)
如果
arg
是整数值,则返回
arg
,否则通过四舍五入将
arg
转换为整数并返回转换后的值。
srand
(
arg
)
arg
必须是整数,用于重置rand
随机数生成器的种子。返回该种子中的第一个随机数(请参见rand
())。每个解释器都有自己的种子。
wide
(
arg
)
将
arg
转换为至少64
位宽的整数值(如果arg
是32
位数字,则使用符号扩展名)。
整数,浮点数和字符串操作数的内部表示形式之间的转换会根据需要自动完成。对于算术计算,在引入某个浮点数之前使用整数,然后再使用浮点。例如:
返回1 ,而
两者都返回1.25 。浮点值总是与“. ”或e 一起返回,这样它们看起来不像整数值。例如:
返回 4.0 而不是 4 。
字符串运算
字符串值可以用作比较运算符的操作数,但表达式计算器会尽可能以整数或浮点形式进行比较,但 eq 和 ne 运算符除外。如果比较的一个操作数是字符串,而另一个操作数有数值,则使用 C sprintf 格式说明符 %d (对于整数)和 %g (对于浮点数)将数字操作数转换回字符串。 例如,命令:
两个都返回1 。第一个比较使用整数比较完成,第二个比较在第二个操作数转换为字符串18 后使用字符串比较完成。由于Tcl 倾向于尽可能地将值视为数字,所以当您真正需要字符串比较并且操作数的值可能是任意的时,使用== 之类的运算符通常不是一个好主意;在这些情况下,最好使用eq 或ne 运算符,或者使用string 命令。
性能考虑
将表达式括在大括号中以获得最佳速度和最小的存储需求。这允许
Tcl
字节码编译器生成最好的代码。
如上所述,表达式被替换了两次:一次被 Tcl 解析器替换,一次被 expr 命令替换。例如,命令:
返回11 ,不是4 的倍数。这是因为Tcl 解析器首先将变量b 替换为$a+2 ,然后expr 命令将计算表达式$a+2*4 。
大多数表达式不需要第二轮替换。它们要么用大括号括起来,否则,它们的变量和命令替换会生成本身不需要替换的数字或字符串。但是,由于一些不带括号的表达式需要两轮替换,字节码编译器必须发出额外的指令来处理这种情况。
对于包含命令替换的不带括号的表达式,往往更消耗计算资源
。这些表达式必须在每次执行表达式时生成新代码来实现。
链接
iRules
优化#
2-
表达式和变量
-https:
//devcentral.f5.com/s/articles/irules-optimization-101-02-expressions-and-variables
TCL
文档
-http:
//aspn.activestate.com /ASPN/docs/ActiveTcl/8.4/tcl/TclCmd/expr.htm
http://aspn.activestate.com/ASPN/docs/ActiveTcl/8.4/tcl/TclCmd/expr.htm
发布评论 加入社群
Vanessa.WANG?
2020-11-24 15:01:38
0
学到了!
相关文章

F5 Python SDK简介
Will Tang
2021-07-29 11:55:36 650

自动化的崛起:如何管理当今世界中的BOT
Vanessa.WANG?
2020-11-24 16:40:01 828

F5对接Rancher容器云平台部署手册v3
晏顺
2020-06-23 17:23:28 2994

回复评论
发布评论