表达式
样书最强大的功能之一是使用表达式。可以在各种方案中使用样本表达式来计算动态值。以下示例是将参数值与文字字符串连接起来的表达式。
示例:
美元的参数。浏览器名称+"-mon"
此表达式检索名为的参数浏览器名称
,并将其与字符串连接起来我的
。
支持以下类型的表达式:
算术表达式
- 添加 (+)
- 减法 (-)
- 乘法 (*)
- 司 (/)
- 模数 (%)
示例:
- 添加两个数字:$参数。+ $ parameters.b
- 乘以两个数字:$参数。一个* 10
- 在将一个数字除以另一个数字后找到剩余数字:
15% 10
中的结果5
字符串表达式
- 连接两个字符串 (+)
示例:
连接两个字符串:str(“应用程序——”)+ parameters.appname美元
列表表达式
合并两个列表 (+)
示例:
连接两个列表:$参数。外部服务器+ parameters.internal-servers美元
如果
parameters.ports-1美元
是 [80, 81] 和parameters.port-2美元
是 [81, 82],则parameters.ports-1美元+美元的参数。ports-2
显示为列表 [80, 81, 81, 82]。
关系表达式
==:测试两个操作数是否相等,如果两个操作数相等则返回真,否则返回错误的。
! =:测试两个操作数是否不同,如果两个操作数不同,则返回真,否则返回错误的。
>:如果第一个操作数大于第二个操作数,则返回真,否则返回错误的。
>=:如果第一个操作数大于或等于第二个操作数,则返回真,否则返回错误的。
<:如果第一个操作数小于第二个操作数,则返回真,否则返回错误的。
<=:如果第一个操作数小于或等于第二个操作数,则返回真,否则返回错误的。
示例:
- 平等运算符的使用:
$parameters.name = = "abcd"
- 使用不等式运算符:
美元parameters.name ! =“默认”
其他关系运算符示例
10 > 9
10 > = 10
0 < 9
10 < = 9
10 = = 10
10 ! = 1
逻辑表达式-布尔值
和:逻辑的“和”运算符。如果两个操作数为 true,则结果为 true,否则为 false。
或者:逻辑的“或”运算符。如果其中一个操作数为 true,则结果为 true,否则为 false。
不:一元运算符。如果操作数为 true,则结果为假,相反。
在: 测试第一个参数是否为第二个参数的子字符串
在:测试项目是否为列表的一部分
注意
您可以键入转换表达式,其中字符串被转换为数字(使用int()内置函数),并将数字转换为字符串(使用str()内置函数)。同样,可以将
tcp端口
转换为数字(使用int()内置函数),然后可以将IP地址转换为字符串(使用str()内置函数)。在任何运算符之前和之后使用分隔符。可以使用以下分隔符:
在运算符之前:
空间
选项卡”,逗号
、、(
、)
、[
,]
运算符后:
空间
、选项卡
、(
、[
例如:
美国广播公司(abc) + def
100% 10
10 > 9
项parameters.some-list美元
逐字字符串表达式
当字符串中的特殊字符必须采用文字形式时,您可以使用逐字字符串。这些字符串可以包含转义字符、反斜杠、引号、括号、空格、括号等。在逐字字符串中,跳过特殊字符的常规解释。字符串中的所有字符都以其文字形式保留。
在样书中,可以使用逐字字符串以文字形式包含Citrix ADC策略表达式。策略表达式通常包含特殊字符。如果没有逐字字符串,您必须通过将字符串拆分为子字符串来转义特殊字符。
要创建逐字字符串,请将字符串封装在特殊字符之间,如下所示:
~{字符串}~<!--NeedCopy-->
您可以在样书表达式中使用逐字字符串。
注意请
勿在输入字符串中使用字符
} ~
的序列,因为此序列表示逐字字符串的结尾。
示例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}
连接多个逐字字符串
您可以将逐字字符串与常规字符串或带插值的字符串连接起来。当你这样做时,样书只会跳过逐字字符串的解释。在字符串之间使用加号 (+) 运算符进行连接。
示例:
价值:"~{“id”:"} ~+% {$ atom.key} %+~{”,"价值”:"} ~+% {$ atom.value} %+~{”}~"<!--NeedCopy-->
在此例子中,将解释% {$ atom.key} %
和% {$ atom.value} %
。而且,剩下的解释被跳过。
目标表达式
在样书定义中,您可以使用美元当前的目标
表达式引用当前目标ADC实例。要特别引用目标ADC实例的IP地址,请按如下方式使用此表达式:
current-target.ip美元<!--NeedCopy-->
示例:
组件:-的名字:lb-comp类型:ns: lbvserver属性:的名字:current-target.ip美元+"-lbvserver"<!--NeedCopy-->
在此示例中,lbvserver
的名称使用目标ADC实例的IP地址。
表达式类型验证
样本引擎现在允许在编译时进行更强的类型检查,也就是说,编写样书时使用的表达式是在导入样书本身的过程中验证的,而不是在创建配置包时进行验证。
对参数,替换,组件,组件属性,组件输出,用户定义变量(repeat-item repeat索引,替代函数的参数)等的所有引用都经过验证,以确定它们的存在和类型。
类型检查示例:
在以下示例中,lbvserver
样书的端口属性的预期类型为tcp端口
。在Citrix Application Delivery Management (ADM) 中,类型验证会在编译时(导入时)进行。编译器会发现该字符串并tcp端口
且不兼容类型,因此样书编译器会显示错误,无法导入或迁移样书。
—name: lbvserver-comp type: ns::lbvserver properties: name: mylb ipv46: 10.102.190.15 port: str("80") servicetype: HTTP
要成功编译此样书,请在编译器中将以下内容声明为数字:
端口:80
标记无效表达式的示例:
在早期版本中,当将无效表达式分配给属性名称时,编译器未检测到无效表达式,并允许将样本导入Citrix ADM。现在,如果将此样书导入到Citrix ADM,则编译器会识别此类无效表达式并标记它。因此,样书无法导入到Citrix ADM。
在此示例中,分配给lb-sg-binding-comp
组件中名称属性的表达式为:components.lbvserver-comp.properties.lbvservername美元
。但是,组件lbvserver-comp
中没有调用lbvservername
的属性。在早期 Citrix ADM 版本中,编译器会允许此表达式并成功导入该表达式。当用户要使用此样本创建配置包时,实际上会失败。但是现在,在导入过程中会识别此类错误,并且样本不会导入到 Citrix ADM。手动更正此类错误并导入样书。
组件:—name: lbvserver-comp type: ns::lbvserver properties: name: mylb ipv46: 10.102.190.15 port: 80 servicetype: HTTP—name: sg-comp type: ns::servicegroup properties: servicegroupname: mysg servicetype: HTTP—name: lb-sg-binding-comp type: ns::lbvserver_servicegroup_binding condition: $parameters。创建绑定属性:name: $components.lbvserver-com .properties。lbvservername servicegroupname: components.sg-comp.properties美元。servicegroupname < !——NeedCopy >
为列表建立索引
现在,可以直接为列表中的项目建立索引来访问它们:
表达式 | 说明 |
美元components.test-lbs [0] |
指thetest-lbs 组件中的第一个项目 |
美元components.test-lbs [0] .properties.p1 |
是指测试磅组件中第一个项目的属性p1 |
美元components.lbcomps [0] .outputs.servicegroups [1] .properties.servicegroupname |
指servicegroups 组件中第二个项目的属性servicegroupname ,该属性是lbcomps 组件第一项的输出 |