[comment]: # ({73d3f62e-73d3f62e})
# 3 上下文用户宏

[comment]: # ({/73d3f62e-73d3f62e})

[comment]: # ({d01ca156-4232eb11})
#### 概述

在[用户宏](/manual/config/macros/user_macros)中，可以使用可选上下文，从而用特定于上下文的值覆盖默认值。

上下文会附加到宏名称后；其语法取决于上下文是否为静态文本值：

    {$MACRO:"static text"}

或正则表达式：

    {$MACRO:regex:"regular expression"} 

请注意，带有正则表达式上下文的宏只能在用户宏配置中定义。如果在其他地方将 `regex:` 前缀用作用户宏上下文，例如在触发器表达式中，它将被视为静态上下文。

上下文是否加引号是可选的（另请参见[重要说明](#important-notes)）。

宏上下文示例：

|示例|说明|
|-------|-----------|
|`{$LOW_SPACE_LIMIT}`|不带上下文的用户宏。|
|`{$LOW_SPACE_LIMIT:/tmp}`|带上下文的用户宏（静态字符串）。|
|`{$LOW_SPACE_LIMIT:regex:"^/tmp$"}`|带上下文的用户宏（正则表达式）。与 `{$LOW_SPACE_LIMIT:/tmp}` 相同。|
|`{$LOW_SPACE_LIMIT:regex:"^/var/log/.*$"}`|带上下文的用户宏（正则表达式）。匹配所有以 /var/log/ 为前缀的字符串。|

[comment]: # ({/d01ca156-4232eb11})

[comment]: # ({2a65d6fe-d403a5a0})
#### 使用场景

可定义带上下文的用户宏，以便在触发器表达式中实现更灵活的阈值设置（基于通过低级别发现获取的值）。例如，您可以定义以下宏：

-   {$LOW\_SPACE\_LIMIT} = 10
-   {$LOW\_SPACE\_LIMIT:/home} = 20
-   {$LOW\_SPACE\_LIMIT:regex:"\^/\[a-z\]+$"} = 30

然后，可在已挂载文件系统发现的触发器原型中，将低级别发现宏用作宏上下文：

    last(/host/vfs.fs.size[{#FSNAME},pfree])<{$LOW_SPACE_LIMIT:"{#FSNAME}"}

发现完成后，触发器中将根据已发现的挂载点或文件系统类型应用不同的低空间阈值。
在以下情况下将生成问题事件：

-   /home 文件夹的可用磁盘空间少于 20%
-   与正则表达式模式匹配的文件夹（如 /etc、/tmp 或 /var）的可用磁盘空间少于 30%
-   不匹配该正则表达式模式且不是 /home 的文件夹，其可用磁盘空间少于 10%

[comment]: # ({/2a65d6fe-d403a5a0})

[comment]: # ({4d28ca51-4d28ca51})
#### 重要笔记

- 如果存在多个具有上下文的用户宏，Zabbix 将尝试首先匹配简单的上下文宏，然后匹配上下文宏未定义顺序的正则表达式。

::: notewarning
不要创建不同的上下文宏匹配相同的字符串以避免未定义的行为。
:::

-   如果在主机上找不到带有上下文的宏，则链接模板或全局，然后搜索没有上下文的宏。
-   上下文中仅支持低级发现宏。任何其他宏被忽略并被视为纯文本。

从技术上讲，宏上下文是使用类似于 [item key](/manual/config/items/item/key) 参数，除了宏上下文是如果有 `,` 字符，则不被解析为多个参数：

-   如果上下文包含 `}`，则必须用 `"` 引用宏上下文字符或以 `"` 字符开头。引号内的引号context 必须用 `\` 字符转义。
-   `\` 字符本身没有被转义，这意味着它是不可能的有一个以 `\` 字符结尾的引用上下文 - 宏
    {$MACRO:"a:\\b\\c\\"} 无效。
-   上下文中的前导空格被忽略，尾随空格是不是：
    - 例如 {$MACRO:A} 与 {$MACRO:A} 相同，但不同{$宏：A}。
-   前导引号和尾随引号后的所有空格都是忽略，但引号内的所有空格都不是：
    -   宏 {$MACRO:"A"}, {$MACRO: "A"}, {$MACRO:"A" } 和 {$MACRO:"A" }相同，但宏{$MACRO:"A"} 和 {$MACRO:" A "}不是。

以下宏都是等价的，因为它们具有相同的上下文：{$MACRO:A}, {$MACRO: A} 和 {$MACRO:"A"}。这是相反的带有监控项键，其中'key\[a\]', 'key\[ a\]' 和 'key\["a"\]' 是语义上相同，但出于唯一性目的而不同。

[comment]: # ({/4d28ca51-4d28ca51})
