Citrix Application Delivery Management 服务

表达式

样书最强大的功能之一是使用表达式。可以在各种方案中使用样本表达式来计算动态值。以下示例是将参数值与文字字符串连接起来的表达式。

示例

$parameters.appname + "-mon"

此表达式检索名为的参数 appname,并将其与字符串连接起来 -mon

支持以下类型的表达式:

算术表达式

  • 添加 (+)
  • 减法 (-)
  • 乘法 (*)
  • 司 (/)
  • 模数 (%)

示例

  • 添加两个数字:$parameters.a + $parameters.b
  • 乘以两个数字:$parameters.a * 10
  • 在一个数字除以另一个数字后查找剩余数字:

15%10 中的结果 5

字符串表达式

  • 连接两个字符串 (+)

示例

连接两个字符串:str(“app-“) + $parameters.appname

列表表达式

合并两个列表 (+)

示例

  • 连接两个列表:$parameters.external-servers + $parameters.internal-servers

  • 如果 $parameters.ports-1 是 [80, 81] 和 $parameters.port-2 是 [81, 82],则 $parameters.ports-1 + $parameters.ports-2 显示为列表 [80, 81, 81, 82]。

关系表达式

  • == :测试两个操作数是否相等,如果它们相等,则返回 true,否则返回 false。

  • =:测试两个操作数是否不同,如果它们不同,则返回 true,否则返回 false。

  • > :如果第一个操作数大于第二个操作数,则返回 true,否则返回 false。

  • >= :如果第一个操作数大于或等于第二个操作数,则返回 true,否则返回 false。

  • < :如果第一个操作数小于第二个操作数,则返回 true,否则返回 false。

  • <= :如果第一个操作数小于或等于第二个操作数,则返回 true,否则返回 false。

示例

  • 平等运算符的使用: $parameters.name = = "abcd"
  • 使用不等式运算符: $parameters.name != "default"
  • 其他关系运算符示例
    • 10 > 9
    • 10 >= 10
    • 0 < 9
    • 10 <= 9
    • 10 == 10
    • 10 != 1

逻辑表达式-布尔值

  • : 逻辑 ‘和’ 运算符. 如果两个操作数为 true,则结果为 true,否则为 false。

  • :逻辑 ‘或’ 运算符。如果其中一个操作数为 true,则结果为 true,否则为 false。

  • :一元运算符。如果操作数为 true,则结果为假,相反。

  • :测试第一个参数是否是第二个参数的子字符串

  • :测试项目是否是列表的一部分

注意

您可以将字符串转换为数字并将数字转换为字符串的类型转换表达式。同样,您可 tcp-port 以转换为数字,并且 IP 地址可以转换为字符串。

在任何运算符之前和之后使用分隔符。可以使用以下分隔符:

  • 在运算符之前: spacetab``、 comma、、 ()[, ]

  • 运算符后: spacetab([

例如:

  • abc + def

  • 100 % 10

  • 10 > 9

逐字字符串表达式

当字符串中的特殊字符必须采用文字形式时,您可以使用逐字字符串。这些字符串可以包含转义字符、反斜杠、引号、括号、空格、括号等。在逐字字符串中,跳过特殊字符的常规解释。字符串中的所有字符都以其文字形式保留。

在样书中,可以使用逐字字符串以文字形式包含 Citrix ADC 策略表达式。策略表达式通常包含特殊字符。如果没有逐字字符串,您必须通过将字符串拆分为子字符串来转义特殊字符。

要创建逐字字符串,请在特殊字符之间封装字符串,如下所示:

~{string}~

您可以在样书中的任何位置使用逐字字符串。

注意:请

勿在输入字符串 }~ 中使用字符序列,因为此序列表示逐字字符串的结尾。

示例:

 ~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~

表达式类型验证

样本引擎现在允许在编译期间进行增强的类型检查,即,在导入样本本身的过程中,而不是在创建配置包时,验证编写样本时使用的表达式,

对参数、替换、组件、组件属性、组件输出、用户定义的变量(重复项、重复索引、替代函数的参数)等的所有引用都是根据它们的存在和类型进行验证的。

类型检查示例

在以下示例中, lbvserver 样书的端口属性的预期类型为 tcp-port。在 Citrix Application Delivery Management (ADM) 中,类型验证会在编译时(导入时)进行。编译器会发现该字符串并 tcp-port 且不兼容类型,因此样书编译器会显示错误,无法导入或迁移样书。

components:
  -
    name: lbvserver-comp
    type: ns::lbvserver
    properties:
      name: mylb
      ipv46: 10.102.190.15
      port: str("80")
      servicetype: HTTP

要成功编译此样书,请在编译器中将以下内容声明为数字:

port: 80

标记无效表达式的示例:

在早期版本中,当将无效表达式分配给属性名称时,编译器未检测到无效表达式,并允许将样本导入 Citrix ADM。现在,如果将此样书导入到 Citrix ADM,则编译器会识别此类无效表达式并标记它。因此,样书无法导入到 Citrix ADM。

在此示例中,分配给 lb-sg-binding-comp 组件中 name 属性的表达式为: $components.lbvserver-comp.properties.lbvservername。但是,组件 lbvservername 中没有调用的属性 lbvserver-comp。在早期的 Citrix ADM 版本中,编译器将允许此表达式并成功导入该表达式。当用户要使用此样本创建配置包时,实际上会失败。但是现在,在导入过程中会识别此类错误,并且样本不会导入到 Citrix ADM。手动更正此类错误并导入样书。

Components:
  -
    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.create-binding
    properties:
      name: $components.lbvserver-comp.properties.lbvservername
      servicegroupname: $components.sg-comp.properties.servicegroupname

为列表建立索引

现在,可以直接为列表中的项目建立索引来访问它们:

   
表达式 说明
$components.test-lbs[0] 引用 test-lbs 组件中的第一个项目
$components.test-lbs[0].properties.p1 引用 test-lbs 组件中的第一个项目的属性 p1
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname 指组件中 servicegroupname 第二个项目的属性,该属性是 servicegroups 组件第一个项目的 lbcomps 输出

表达式