F5社区-F5技术交流中心

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 ? thenbody1  elseif  expr2 ? thenbody2  elseif ... ? else? ? bodyN?
  •  - 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 则返回一个空字符串。

示例

一个简单的条件判断

如果要在其中添加其他条件,则可以这样:

如果要添加一个默认情况,即当没有条件满足if/elseif 条件时,则需要再添加else 子句:

另外,请记住,“  then ” “  else ” 是可选的。在上面的示例中,为等效功能,可以省略“  then ” “  else ”

对于那些VB 程序员来说,您可能更想保留“  then ” 参数。
另外,请记住表达式可以在多行上。这可能是使用“  then ” 参数的一个好例子。

表达式

“ if” 命令的核心是用于条件测试的表达式。这些表达式的计算方式与TCL“ expr” 命令计算其参数的方式相同。以下是表达式的规则:

  •  - Tcl 表达式由操作数,运算符和括号的组合组成。
  •  - 操作数、运算符和括号之间可以使用空格;表达式的指令会忽略它。
  •  - 在可能的情况下,操作数被解释为整数值。
  •  - 整数值可以以十进制(通常情况下),八进制(如果操作数的第一个字符为 0 )或十六进制(如果操作数的前两个字符为 0x )指定。
  •  - 如果一个操作数不具有上面给出的整数格式之一,则在可能的情况下将其视为浮点数。
  •  - 浮点数可以通过符合 ANSI C 编译器接受的任何方式指定(除了在大多数安装中不允许使用 f F l L 后缀)。例如,以下所有都是有效的浮点数: 2.1 3 6e4 7.91e + 16
  •  - 如果无法进行数字解释(请注意,所有非数字或布尔值的文字操作数都必须用大括号或双引号引起来),则操作数将作为字符串保留(并且只能对其应用有限的一组运算符)。

操作数

可以通过以下任何一种方式指定操作数:

  1. 1、作为数值,可以是整数或浮点数。
  2. 2、作为布尔值,使用字符串理解的任何形式都是布尔值。
  3. 3、作为一个 Tcl 变量,使用标准 $ 表示法。变量的值将用作操作数。
  4. 4、作为用双引号引起来的字符串。表达式解析器将对引号之间的信息执行反斜杠,变量和命令替换,并将结果值用作操作数
  5. 5、如用大括号括起来的字符串。大括号和匹配的大括号之间的字符将用作操作数,而不会进行任何替换。
  6. 6、作为括在方括号中的 Tcl 命令。命令将被执行,其结果将被用作操作数。
  7. 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

逻辑或( || )的用户友好等效项。


数学函数

iRules 中包含以下基于TCL 的数学函数

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 位数字,则使用符号扩展名)。


类型,溢出和精度

所有涉及整数的内部计算都是使用C 类型 long 完成的 ,所有涉及浮点的内部计算都使用C 类型 double 进行的 。将字符串转换为浮点时,将检测到指数溢出并导致Tcl 错误。对于从字符串到整数的转换,溢出的检测取决于本地C 库中某些例程的行为,因此它应该被认为是不可靠的。在任何情况下,对于中间结果,整数溢出和下溢通常不能可靠地检测到。浮点上溢和下溢在硬件层面上被检测出来,这通常是相当可靠的。

整数,浮点数和字符串操作数的内部表示形式之间的转换会根据需要自动完成。对于算术计算,在引入某个浮点数之前使用整数,然后再使用浮点。例如:


返回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优化技术关于表达式和变量

结论

“ if” 语句是您编写任何iRule 的基础。尽管了解所有这些详细信息并不重要,但该文档可以作为您的可靠参考。

链接
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

http://tmml.sourceforge.net/doc/tcl/index.html

发布评论 加入社群

发布评论

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

Login

手机号
验证码
© 2019 F5 Networks, Inc. 版权所有。京ICP备16013763号-1