
# 基本语法
RFS配置语言兼容HCL语法，具有配置简单，可读性强等特点，并且兼容JSON语法。本文主要介绍HCL语言的基本语法及常见函数。
RFS配置语言主要由参数(Argument)，块(Block)，表达式(Experssion)和函数(Functions)组成。
#### 参数 (Argument)
使用等号将一个值或表达式赋值给指定的参数名称，参数名称可以使用字母、数字、下划线(_)和连接符(-)表示，且首字母不能是数字，例如：
```
image_id = "ad091b52-742f-469e-8f3c-fd81cadf0743"
```
#### 块 (Block)
块将多个参数聚合在一起，并支持嵌套。块由块类型、块标签和块主体构成，格式如下：
```
resource "huaweicloud_compute_instance" "myinstance" {
   name   = "myinstance"
    ......
    network {
        uuid = "55534eaa-533a-419d-9b40-ec427ea7195a"
    }
}
```
在使用块时必须先声明其对应的类型，样例中resource和network 均为块类型，其中resource为顶层块类型，network为嵌套块类型。HCL语言支持的顶层块类型包括：provider，resource，data，variable，output，module，locals等关键字。
块标签在块类型之后定义，且数量由块类型决定，样例中resource块类型包含两个标签：huaweicloud_compute_instance和myinstance，嵌套的network类型没有块标签。块主体定义在块最后，由 { 和 } 字符进行封装，在块主体内可以嵌套其他类型以实现不同的层级结构。
#### 参数类型
HCL支持以下参数类型：
**基本类型**
- **string：**字符串类型，由一个或多个Unicode字符组成，例如 "hello"。
- **number：**数字类型，可以表示整数和浮点数。
- **bool：**布尔类型，只能是 true 或 false。
HCL能够根据参数类型自动将number和bool类型转换为string类型。如果一个字符串能够表示为一个数字或布尔类型的值，也可以进行反向转换。字符串、数字和布尔类型的参数可以直接赋值，例如：
```
disk_type = "SSD"
disk_size = 40
enable    = true
# 支持使用字符串表示数字和布尔类型
disk_size = "40"
enable    = "true"
```
**集合类型**
- **map(...)：**映射类型，以键值对(key-value pair) 的方式组合起来的数据元素集合，其中key为string类型，对应的值可以是string，number，bool等类型，且所有元素的值必须是同一类型。
- **list(...)：**列表类型，具有同类型的数据元素集合，元素可以是基本类型和块类型，列表索引从0开始。
- **set(...)** **：**集合类型，类似于列表类型，但是集合中的元素是没有任何辅助标识符或顺序，且元素具有唯一性。
映射类型使用 {} 封装，其表示形式非常灵活：键值对可以使用等号"="或冒号":"连接；如果key不以数字开头，可以不加双引号；对于多行映射，键值对之间可以使用换行符或者逗号进行分隔。推荐使用等号连接键值对并用换行符进行分隔，例如：
```
# 推荐格式
tags = {
  foo = "bar"
  key = "value"
}
# 其他格式
tags = {"foo" = "bar", "key" = "value"}
tags = {"foo" : "bar", "key" : "value"}
tags = {foo = "bar", key = "value"}
tags = {foo : "bar", key : "value"}
tags = {
  foo : "bar"
  key : "value"
}
```
列表类型和集合类型的表示方式相同，其中元素为基本类型的列表/集合使用 \[\] 封装，元素为块类型的列表/集合使用重复块的形式表示，例如：
```
# 基本类型的列表
security_groups = ["default", "internal"]
# 块类型的列表
network {
  uuid = "55534eaa-533a-419d-9b40-ec427ea7195a"
}
network {
  uuid = "ad091b52-742f-469e-8f3c-fd81cadf0743"
}
```
**特殊类型**
- **null：**空类型，如果将一个参数设置为null，表示这个参数未填写，HCL会自动忽略该参数，并使用默认值。null在条件表达式中较为常见，如 var.test=="" ? null : var.test，表示当var.test的值为""时，就将其忽略。
#### 其他语法
- 单行注释以#或//开头；
- 多行注释以/\*开始，以\*/结束，不支持嵌套块注释。
- Terraform配置文件使用UTF-8编码，对于标识符、注释和字符串都支持非ASCII字符。
- 多行字符串以\<\<EOF开头，中间是字符串内容，最后以EOF结尾。EOF也可以替换为其他字符。例如：
  ```
  resource "huaweicloud_obs_bucket" "web_bucket" {
    ...
    website {
      ...
      routing_rules = <<EOF
  [{
      "Condition": {
          "KeyPrefixEquals": "docs/"
      },
      "Redirect": {
          "ReplaceKeyPrefixWith": "documents/"
      }
  }]
  EOF
    }
  }
  ```
  
 
