表达式

Last published : Oct 06, 2026
StyleBook 最强大的功能之一是使用表达式。您可以在各种场景中使用 StyleBook 表达式来计算动态值。以下示例是一个将参数值与文字字符串连接起来的表达式。
示例:
$parameters.appname + "-mon"
此表达式检索名为 appname 的参数,并将其与字符串 -mon 连接起来。
注意
在 StyleBook 定义中定义参数和表达式时,StyleBook 支持使用保留关键字。保留关键字为 - and、false、in、not、true 和 or。
支持以下类型的表达式:

算术表达式

  • 加法 (+)
  • 减法 (-)
  • 乘法 (*)
  • 除法 (/)
  • 模 (%)
示例:
  • 两个数字相加:$parameters.a + $parameters.b
  • 两个数字相乘:$parameters.a * 10
  • 查找一个数字除以另一个数字后的余数:
15%10 结果为 5

字符串表达式

  • 连接两个字符串 (+)
示例:
连接两个字符串:str("app-") + $parameters.appname

列表表达式

合并两个列表 (+)
示例:
  • 连接两个列表:$parameters.external-servers + $parameters.internal-servers
  • 如果 $parameters.ports-1 为 且 $parameters.port-2 为 ,则 $parameters.ports-1 + $parameters.ports-2 显示为列表 。

关系表达式

  • == :测试两个操作数是否相等,如果相等则返回 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

逻辑表达式 - 布尔

  • and:逻辑“与”运算符。如果两个操作数都为真,则结果为真,否则为假。
  • or:逻辑“或”运算符。如果其中一个操作数为真,则结果为真,否则为假。
  • not:一元运算符。如果操作数为真,则结果为假,反之亦然。
  • in:测试第一个参数是否是第二个参数的子字符串
  • in:测试项是否是列表的一部分
注意
您可以对表达式进行类型转换,其中字符串转换为数字(使用 int() 内置函数),数字转换为字符串(使用 str() 内置函数)。同样,您可以将 tcp-port 转换为数字(使用 int() 内置函数),并且可以将 IP 地址转换为字符串(使用 str() 内置函数)。
在任何运算符前后使用分隔符。您可以使用以下分隔符:
  • 运算符之前:space、tab、comma、(、)、[、]
  • 运算符之后:space、tab、(、[
例如:
  • abc + def
  • 100 % 10
  • 10 > 9
  • $item in $parameters.some-list

Splat 表达式

Splat 表达式 [*] 提供了一种更简单的方法,可以从复杂列表中为所有迭代检索特定属性。您现在可以在 StyleBook 定义中包含 splat 表达式。
语法:
list[*].attribute
此表达式迭代其左侧指定的列表中的所有项,并返回其右侧指定的属性值。
当您想从列表中检索每个虚拟服务器的 IP 地址或主机名时,可以使用以下 splat 表达式:
示例 1:
$parameters.server-members[*].hostname
此表达式返回所有服务器成员的主机名列表。
示例 2:
$parameters.server-members[*].sub-domains[*].name
此表达式返回每个服务器成员子域下的所有名称列表。
这些表达式始终返回最右侧元素类型的列表。

原义字符串表达式

当字符串中的特殊字符必须采用其字面形式时,您可以使用原义字符串。这些字符串可以包含转义字符、反斜杠、引号、括号、空格、方括号等。在原义字符串中,特殊字符的常规解释会被跳过。字符串中的所有字符都以其字面形式保留。
在 StyleBook 中,您可以使用原义字符串以字面形式包含 NetScaler 策略表达式。策略表达式通常包含特殊字符。如果没有原义字符串,您必须通过将字符串分解为子字符串来转义特殊字符。
要创建原义字符串,请按如下方式将字符串封装在特殊字符之间:
~{string}~
您可以在 StyleBook 表达式中使用原义字符串。
注意
请勿在输入字符串中使用字符序列 }~,因为此序列表示逐字字符串的结尾。
示例:
~{HTTP.REQ.COOKIE.VALUE("jsessionid") ALT HTTP.REQ.URL.BEFORE_STR("=").AFTER_STR(";jsessionid=") ALT HTTP.REQ.URL.AFTER_STR(";jsessionid=")}~

目标表达式

在 StyleBook 定义中,您可以使用 $current-target 表达式来引用当前目标 NetScaler 实例。要专门引用目标 NetScaler 实例的 IP 地址,请按如下方式使用此表达式:
$current-target.ip
示例:
components:
 -
  name: lb-comp
  type: ns::lbvserver
  properties:
    name: $current-target.ip + "-lbvserver"
在此示例中,lbvserver 的名称使用目标 NetScaler 实例的 IP 地址。

表达式类型验证

StyleBook 引擎现在允许在编译时进行更强的类型检查,即,在编写 StyleBook 时使用的表达式在导入 StyleBook 本身时进行验证,而不是在创建配置包时进行验证。
对参数、替换、组件、组件属性、组件输出、用户定义变量(重复项、重复索引、替换函数的参数)等的所有引用都将验证其存在性和类型。
类型检查示例:
在以下示例中,lbvserver StyleBook 的端口属性的预期类型为 tcp-port。在 NetScaler Console 中,类型验证在编译时(导入时)进行。编译器发现字符串和 tcp-port 不是兼容类型,因此 StyleBook 编译器会显示错误并无法导入或迁移 StyleBook。

components:
  -
    name: lbvserver-comp
    type: ns::lbvserver
    properties:
      name: mylb
      ipv46: 10.102.190.15
      port: str("80")
      servicetype: HTTP
要成功编译此 StyleBook,请在编译器中将以下内容声明为数字:
port: 80
标记无效表达式的示例:
将 StyleBook 导入 NetScaler Console 时,编译器会识别并标记无效表达式。因此,StyleBook 无法导入到 NetScaler Console。
在以下示例中,分配给 lb-sg-binding-comp 组件中名称属性的表达式为:$components.lbvserver-comp.properties.lbvservername。但是,lbvserver-comp 组件中没有名为 lbvservername 的属性。
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

数据类型的隐式类型转换

当您对不同数据类型使用 StyleBook 表达式时,StyleBook 引擎现在会将输出隐式类型转换为适当的数据类型。数据类型的隐式类型转换支持二进制操作和值赋值。
二进制操作示例:
  • 将类型为 string 和 number 的两个变量相加 (+),会将输出数据类型设置为 string。
$parameters.appname + '_' + $parameters.app_instance_num
  • 将类型为 string 和 ipaddress 的两个变量相加 (+),会将输出数据类型设置为 string。
$parameters.appname + '_' + $parameters.instance_ip
  • 将类型为 ipaddress 和 number 的两个变量相加 (+),会将输出数据类型设置为 ipaddress。
$parameters.instance_ip + $parameters.number
  • 将类型为 ipaddress 和 number 的两个变量相减 (-),会将输出数据类型设置为 ipaddress。
$parameters.instance_ip - $parameters.number
  • 将类型为 string 和 number 的两个变量相乘 (*),会将输出数据类型设置为 string。
$parameters.dummy_str * $parameters.count
值分配示例:
  • 如果变量定义为 string 数据类型,则分配的值将转换为定义的数据类型。
name: $parameters.port * 3
  • 如果变量定义为 portnumber 数据类型,则分配的值将转换为 portnumber 数据类型,但存在例外情况。
port: $index + $parameters.lower_limit

列表索引

现在可以通过直接索引来访问列表项:
表达式 描述
$components.test-lbs[0] 指 thetest-lbs 组件中的第一个项
$components.test-lbs[0].properties.p1 指 test-lbs 组件中第一个项的属性 p1
$components.lbcomps[0].outputs.servicegroups[1].properties.servicegroupname 指 servicegroups 组件中第二个项目的属性 servicegroupname,该属性是 lbcomps 组件中第一个项目的输出

StyleBook 中的策略表达式

StyleBooks GUI 允许您通过从列表中选择项目来构建 NetScaler® 策略表达式,从而帮助您更快、更准确地创建表达式。
StyleBook 中的策略表达式允许您创建灵活且可自定义的配置。您可以根据各种参数、属性或变量指定条件。策略表达式通常用于实施 NetScaler 策略配置。

在 StyleBooks GUI 中启用策略表达式编辑器

要使 EPA 或表达式编辑器可用于某个参数,请在参数定义中指定 is_policy_expression GUI 属性。启用此设置(设置为 true)后,您可以在为此参数输入值时调用表达式编辑器。
parameters:
  -
    name: expression
    type: string
    label: Expression
    required: true
    gui:
      is_policy_expression: true

创建和构建策略表达式

  1. 导航到 Applications > Configurations > StyleBooks。StyleBooks 页面显示 NetScaler Console 中所有可用的 StyleBook。
  2. 选择一个在其参数中包含策略表达式的 StyleBook。
  3. 单击创建配置。在创建配置页面中,输入此 StyleBook 中定义的所有参数的值。
  4. 单击表达式字段旁边的图标。创建表达式页面随即出现。
    使用表达式创建配置
  5. 在创建表达式中,使用直观的下拉列表构建您的策略表达式。单击提交。
    表达式编辑器
    如果要创建自定义策略表达式,请单击 EPA 编辑器或表达式编辑器来构建您的表达式。在预览表达式中查看您的表达式,然后单击提交。
  6. 选择应部署配置的目标 NetScaler 实例,然后单击“提交”。
    包含表达式的配置包