
# 常见函数
HCL支持丰富的内置函数，用于处理字符串、数值计算、加密，类型转换等操作，您可以通过函数名称进行调用，其语法如下：
```
<函数名称>(<参数1>, <参数2> ...)
```
本文主要对HCL中常见的函数进行总结并通过样例说明其用法。您可以通过Terraform [官方文档](https://www.terraform.io/docs/configuration/functions.html)查看完整的函数支持列表。
#### 字符串函数
表1字符串函数 
| 函数名称    | 函数描述                   | 样例                                    | 运行结果                      |
|:---|:---|:---|:---|
| format  | 字符串格式化                 | format("Hello, %s!", "cloud")         | Hello, cloud!             |
| lower   | 将字符串中的字母转换为小写          | lower("HELLO")                        | hello                     |
| upper   | 将字符串中的字母转换为大写          | upper("hello")                        | HELLO                     |
| join    | 使用自定义字符将列表拼接成字符串       | join(", ", \["One", "Two", "Three"\]) | One, Two, Three           |
| split   | 根据分隔符拆分字符串             | split(", ", "One, Two, Three")        | \["One", "Two", "Three"\] |
| substr  | 通过偏移量和长度从给定的字符串中提取一个子串 | substr("hello world!", 1, 4)          | ello                      |
| replace | 把字符串中的str1替换成str2      | replace("hello, cloud!", "h", "H")    | Hello, cloud!             |
   
#### 数值计算函数
表2数值计算函数 
| 函数名称  | 函数描述    | 样例                                                                                  | 运行结果                                                 |
|:---|:---|:---|:---|
| abs   | 计算绝对值   | abs(-12.4)                                                                          | 12.4                                                 |
| max   | 计算最大值   | max(12, 54, 6) max(\[12, 54, 6\]...) | 54 54 |
| min   | 计算最小值   | min(12, 54, 6) min(\[12, 54, 6\]...) | 6 6    |
| log   | 计算对数    | log(16, 2)                                                                          | 4                                                    |
| power | 计算x的y次幂 | power(3, 2)                                                                         | 9                                                    |
   
#### 集合函数
表3集合函数 
| 函数名称    | 函数描述                                | 样例                                                                                                                                                                               | 运行结果                                                                                                  |
|:---|:---|:---|:---|
| element | 通过下标从列表中检索对应元素值                     | element(\["One", "Two", "Three"\], 1)                                                                                                                                            | Two                                                                                                   |
| index   | 返回给定值在列表中的索引，如果该值不存在将报错。            | index(\["a", "b", "c"\], "b")                                                                                                                                                    | 1                                                                                                     |
| lookup  | 使用给定的键从映射表中检索对应的值。如果给定的键不存在，则返回默认值。 | lookup({IT="A", CT="B"}, "IT", "G") lookup({IT="A", CT="B"}, "IE", "G")                                                           | A G                                                   |
| flatten | 展开列表中的嵌套元素                          | flatten(\[\["a", "b"\], \[\], \["c"\]\])                                                                                                                                         | \["a", "b", "c"\]                                                                                     |
| keys    | 返回map中的所有key                        | keys({a=1, b=2, c=3})                                                                                                                                                            | \["a", "b", "c"\]                                                                                     |
| length  | 获取列表、映射或是字符串的长度                     | length(\["One", "Two", "Three"\]) length({IT="A", CT="B"}) length("Hello, cloud!") | 3 2 13 |
   
#### 类型转化函数
表4类型转化函数 
| 函数名称     | 函数描述          | 样例                               | 运行结果                      |
|:---|:---|:---|:---|
| toset    | 将列表类型转换为集合类型  | toset(\["One", "Two", "One"\])   | \["One", "Two"\]          |
| tolist   | 将集合类型转换为列表类型  | toset(\["One", "Two", "Three"\]) | \["One", "Two", "Three"\] |
| tonumber | 将字符串类型转换为数字类型 | tonumber("33")                   | 33                        |
| tostring | 将数字类型转换为字符串类型 | tostring(33)                     | "33"                      |
   
#### 编码函数
表5编码函数 
| 函数名称         | 函数描述                                | 样例                                   | 运行结果                                                     |
|:---|:---|:---|:---|
| base64encode | 将UTF-8字符串转换为base64编码                | base64encode("Hello, cloud!")        | SGVsbG8sIGNsb3VkIQ==                                     |
| base64decode | 将base64编码解码为UTF-8字符串(结果非UTF-8格式会报错) | base64decode("SGVsbG8sIGNsb3VkIQ==") | Hello, cloud!                                            |
| base64gzip   | 将UTF-8字符串压缩并转换为base64编码             | base64gzip("Hello, cloud!")          | H4sIAAAAAAAA//JIzcnJ11FIzskvTVEEAAAA//8BAAD//wbrhYUNAAAA |
   
#### 哈希和加密函数
表6哈希和加密函数 
| 函数名称         | 函数描述                       | 样例                            | 运行结果                                                                                                                             |
|:---|:---|:---|:---|
| sha256       | 计算字符串的SHA256值（16进制）        | sha256("Hello, cloud!")       | 0ad167d1e3ac8e9f4e4f7ba83e92d0e3838177e959858631c770caaed8cc5e3a                                                                 |
| sha512       | 计算字符串的SHA512值（16进制）        | sha512("Hello, cloud!")       | 6eb6ed9fc4edffaf90e742e7697f6cc7d8548e98aa4d5aa74982e5cdf78359e84a3ae9f226313b2dec765bf1ea4c83922dbfe4a61636d585da44ffbd7e900f56 |
| base64sha256 | 计算字符串的SHA256值，并转换为base64编码 | base64sha256("Hello, cloud!") | CtFn0eOsjp9OT3uoPpLQ44OBd+lZhYYxx3DKrtjMXjo=                                                                                     |
| base64sha512 | 计算字符串的SHA512值，并转换为base64编码 | base64sha512("Hello, cloud!") | brbtn8Tt/6+Q50LnaX9sx9hUjpiqTVqnSYLlzfeDWehKOunyJjE7Lex2W/HqTIOSLb/kphY21YXaRP+9fpAPVg==                                         |
| md5          | 计算MD5值                     | md5("hello world")            | 5eb63bbbe01eeed093cb22bb8f5acdc3                                                                                                 |
   
![](https://support.huaweicloud.com/tr-aos/public_sys-resources/note_3.0-zh-cn.png)
base64sha512("Hello, cloud!")不等于base64encode(sha512("Hello, cloud!"))，因为sha512计算的十六进制值结果在Terraform中是Unicode编码格式，并没指定UTF-8实现。
#### 文件操作函数
表7文件操作函数 
| 函数名称       | 函数描述                 | 样例                          | 运行结果                                |
|:---|:---|:---|:---|
| abspath    | 计算文件的绝对路径            | abspath("./hello.txt")      | /home/demo/test/terraform/hello.txt |
| dirname    | 计算字符串中包含的路径          | dirname("foo/bar/baz.txt")  | foo/bar                             |
| basename   | 计算字符串中的文件名           | basename("foo/bar/baz.txt") | baz.txt                             |
| file       | 读取文件并返回文件内容          | file("./hello.txt")         | Hello, cloud!                       |
| filebase64 | 读取文件并返回文件内容的base64编码 | filebase64("./hello.txt")   | SGVsbG8sIGNsb3VkIQ==                |
   
