

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在工作流步骤中使用条件语句
<a name="wfdoc-conditional-statements"></a>

条件语句以 `if` 语句文档属性开头。`if` 语句的最终目的为确定是运行还是跳过该步骤操作。如果 `if` 语句解析为 `true`，则该步骤操作将运行。如果解析为 `false`，Image Builder 将跳过该步骤操作并在日志中记录 `SKIPPED` 的步骤状态。

`if` 语句支持分支语句（`and`、`or`）和条件修饰符 (`not`)。其还支持以下比较运算符，这些运算符根据所比较的数据类型（字符串或数字）执行值比较（等于、小于、大于）。

**支持的比较运算符**
+ `booleanEquals`
+ `numberEquals`
+ `numberGreaterThan`
+ `numberGreaterThanEquals`
+ `numberLessThan`
+ `numberLessThanEquals`
+ `stringEquals`

**分支语句和条件修饰符的规则**  
以下规则适用于分支语句（`and`、`or`）和条件修饰符 (`not`)。
+ 分支语句和条件修饰符必须单独出现在某一行上。
+ 分支语句和条件修饰符必须遵循级别规则。
  + 父级别只能有一个语句。
  + 每个子分支或修饰符都会启动一个新级别。

  有关级别的更多信息，请参阅 [条件语句中的嵌套级别](#wfdoc-conditional-structure)。
+ 每个分支语句必须至少包含一个子条件语句，但不能超过十个。
+ 条件修饰符仅对一个子条件语句执行操作。

## 条件语句中的嵌套级别
<a name="wfdoc-conditional-structure"></a>

条件语句在自身部分中的多个级别上执行操作。例如，`if` 语句属性在工作流文档中与步骤名称和操作显示在同一级别。这是条件语句的基础。

您可以指定最多四个级别的条件语句，但父级别只能显示一个语句。所有其他分支语句、条件修饰符或条件运算符都从此处缩进，每个级别缩进一个。

以下概述显示了条件语句的最大嵌套级别数。

```
base:
  parent: 
    - child (level 2)
        - child (level 3)
            child (level 4)
```

`if` 属性  
`if` 属性将条件语句指定为文档属性。这是零级。

父级别  
这是条件语句的第一级嵌套。此级别只能有一个语句。如果不需要分支或修饰符，则可以为没有子语句的条件运算符。除条件运算符外，此级别不使用连接号表示法。

子级别  
二级到四级被视为子级别。子语句可以包括分支语句、条件修饰符或条件运算符。

**示例：嵌套级别**  
以下示例演示了条件语句的最大级别数。

```
if:
  and:                             #first level
    - stringEquals: 'my_string'    #second level
      value: 'my_string'
    - and:                         #also second level
        - numberEquals: '1'        #third level
          value: 1
        - not:                     #also third level
            stringEquals: 'second_string'      #fourth level
            value: "diff_string"
```

**嵌套规则**
+ 子级的每个分支或修饰符都会启动一个新级别。
+ 每个级别都可缩进。
+ 最多可以有四个级别，包括父级别的一个语句、修饰符或运算符，以及最多三个其他级别。

## 条件语句示例
<a name="wfdoc-conditional-examples"></a>

这组示例演示了条件语句的各个方面。

**分支：and**  
`and` 分支语句对作为分支子级的表达式列表执行操作，所有这些表达式的计算结果都必须为 `true`。Image Builder 按照表达式在列表中出现的顺序计算表达式。如果任何表达式的计算结果为 `false`，则停止处理，该分支将视为 `false`。

以下示例的计算结果为 `true`，因为两个表达式的计算结果均为 `true`。

```
if:
  and:
    - stringEquals: 'test_string'
      value: 'test_string'
    - numberEquals: 1
      value: 1
```

**分支：or**  
`or` 分支语句对作为该分支子级的表达式列表执行操作，其中至少有一个表达式的计算结果必须为 `true`。Image Builder 按照表达式在列表中出现的顺序计算表达式。如果任何表达式的计算结果为 `true`，则停止处理，该分支将视为 `true`。

即使第一个表达式为 `false`，以下示例的计算结果仍为 `true`。

```
if:
  or:
    - stringEquals: 'test_string'
      value: 'test_string_not_equal'
    - numberEquals: 1
      value: 1
```

**条件修饰符：not**  
`not` 条件修饰符否定作为分支子级的条件语句。

当 `not` 修饰符否定 `stringEquals` 条件语句时，以下示例的计算结果为 `true`。

```
if:
  not:
    - stringEquals: 'test_string'
      value: 'test_string_not_equal'
```

**条件语句：booleanEquals**  
`booleanEquals` 比较运算符对布尔值进行比较，如果布尔值完全匹配，则返回 true。

以下示例可确定 `collectImageScanFindings` 是否启用。

```
if:
  - booleanEquals: true
    value: '$.imagebuilder.collectImageScanFindings'
```

**条件语句：stringEquals**  
`stringEquals` 比较运算符对两个字符串进行比较，如果两个字符串完全匹配，则返回 true。如果其中一个值不是字符串，则 Image Builder 会在比较之前将其转换为字符串。

以下示例对平台系统变量进行了比较，以确定工作流是否在 Linux 平台上运行。

```
if:
  - stringEquals: 'Linux'
    value: '$.imagebuilder.platform'
```

**条件语句：numberEquals**  
`numberEquals` 比较运算符对两个数字进行比较，如果两个数字相等，则返回 true。要比较的数字必须为以下格式之一。
+ 整数
+ 浮点型
+ 与以下正则表达式模式相匹配的字符串：`^-?[0-9]+(\.)?[0-9]+$`。

以下示例比较的计算结果均为 `true`。

```
if:
  # Value provider as a number
  numberEquals: 1
  value: '1'
  
  # Comparison value provided as a string
  numberEquals: '1'
  value: 1
  
  # Value provided as a string
  numberEquals: 1
  value: '1'
  
  # Floats are supported
  numberEquals: 5.0
  value: 5.0
  
  # Negative values are supported
  numberEquals: -1
  value: -1
```