
# 表达式
表达式用于引用或计算配置中的值，最简单的表达式是文字表达式，如 "hello world" 或5。Terraform支持多种表达式，包括运算符、条件表达式以及丰富的内置函数。
通过 "terraform console" 命令可以打开一个交互式的控制台，您可以使用该控制台进行表达式及内置函数的体验和测试。
#### 运算符
运算符是执行特定的数学或逻辑操作的服务，Terraform支持以下类型的运算符：
- 算术运算符：操作数和结果都为数字类型，包括：+，-（减法），\*，/，%，-（负数）。
- 关系运算符：操作数为任意类型，结果为布尔值，包括：==，！=。
- 比较运算符：操作数为数字类型，结果为布尔值，包括：\>，\>=，\<，\<=。
- 逻辑运算符：操作数和结果都为布尔类型，包括：\|\|，\&\&，！。
在表达式中使用多个运算符时，将按照以下优先级进行求解：
1. !, - (负数)
2. \*, /, %
3. +, - (减法)
4. \>, \>=, \<, \<=
5. ==, !=
6. \&\&
7. \|\|
#### 条件表达式
条件表达式采用布尔表达式的值进行二选一，其语法可以表示为：
```
condition ? true_value : false_value
```
该语句表示：如果condition为true，结果为true_value，否则为false_value。条件表达式的结果可以是任意类型，但true_value和false_value的类型必须保持一致。条件表达式的常见用法是使用默认值替换无效值，如下：
```
var.a != "" ? var.a : "default-a"
```
该语句表示：如果var.a的值不为空，则返回var.a的值，否则返回一个默认值。
#### for 表达式
for表达式用于遍历集合类型 (map、list、set) 中的每个元素，并对元素进行处理，最后将结果输出为一个新的集合类型。for表达式的输出结果取决于所使用的括号类型：
- 使用 '\[' 和 '\]' 将生成一个列表
- 使用 '{' 和 '}' 将生成一个映射/对象
假设列表 mylist 的值为 \["AA", "BBB", "CCCC"\]，您可以使用for表达式对 mylist 中的每个字符串元素转换为小写，并输出一个列表：
```
> [for str in var.mylist : lower(str)]
[
  "aa",    
  "bbb",
  "cccc", 
]
```
您也可以将结果输出为一个映射，映射关系通过 "=\>" 确定：
```
> {for str in var.mylist : str => lower(str)}
{
  "AA" = "aa"    
  "BBB" = "bbb"
  "CCCC" = "cccc" 
}
```
映射类型也可以通过for表达式转换进行处理，假设 mymap 的值为 {element1="aaa", element2="bbb", element3="ccc"}，您可以将映射中的每个键值转换为大写：
```
> {for key, value in var.mymap : key => upper(value)}
{
  "element1 = "AAA"    
  "element2 = "BBB"
  "element3 = "CCC" 
}
```
此外，for表达式还可以使用if语句对元素进行过滤：
```
> [for str in var.list : upper(str) if length(str) >= 3] 
[
  "bbb",    
  "cccc",
]
```
#### 参考资料
<https://www.terraform.io/docs/configuration/expressions.html>
