最近在写配置的时候, 发现很多配置文件都是用yaml
语法, 比如docker-composer
k8s
等等. 因此整理一下yaml
语法以备后续翻阅. 其实很简单, 一眼看上去和json
类似.
可以通过网站校验yaml
语法是否符合规则: https://www.bejson.com/validators/yaml_editor/
基本语法
-
使用空格进行缩进(tab 不行)
-
缩进的空格数目随意, 左侧对其即可.
-
语法分割的冒号
:
和逗号,
后面必须跟空格- 正因如此, 字符串可以直接写成这样:
1234,5678
- 正因如此, 字符串可以直接写成这样:
-
#
为整行注释
数据结构
哈希
# 第一种写法, 同级元素整合为一个对象
hash1:
name: Xiaoming
age: 15
# 第二种写法, 也可以写到一行
hash2: {name: XiaoMing, age: 15}
# 当哈希的 key 或 Value 是一个符合类型的时候. 可以使用 ? : 配合的方式.
# 不过这玩意应该用不到吧,没有谁会写这么个配置
hash3:
?
name: XiaoMing
age: 15
:
address: BeiJing
?
name: LiMing
age: 20
没了, 简单吧.
数组
# 第一种写法, 使用中横线`-`分割的同级元素, 整合为一个数组
list1:
- value1
- value2
# 第二种写法, 也可以写到一行
list2: [value1, value2]
基本类型
# 基础类型直接写就行
number: 12.30
# 可以使用科学记数法表示
number2: 2.352145e+5
# 二进制表示法
number3: -b1010_0010
# 布尔值. true/false
isMan: true
# ~ 标识 null
parent: ~
# 时间使用 ISO8601 gesh格式标识
isoTime: 2021-12-26T14:45:03.394Z
isoDate: 2021-12-26
# 使用 !! 强制转换数据类型
# 内置类型包括: int, float, bool, str, binary(字符串), timestamp(时间), null, set, omap(哈希列表), pairs(哈希列表), seq(列表), map(哈希)
str1: !!str 1234
str2: !!str true
字符串
其中字符串应该是使用场景最多的了.
# 默认直接写即可
# 注意, 若存在特殊字符会被转义
str1: 一行字符串
# 字符串中包含特殊字符或空格时, 需要使用引号包裹
str2: '空 格'
# 当单引号包裹的字符串中存在单引号, 要使用两个单引号进行转义
str3: '包含单''引号'
# 注意, 双引号字符串不会对字符串进行转义
str4: "空\n格"
# 写成多行的字符串, 从第二行开始要有缩进.
# 注意, 这种方式, 会将行尾的换行转为空格. 故结果还是一行
str5: 多行字符串
第二行
第三行
# 在字符串前面添加标识符可标识不同的情况:
# `|` 保留行尾换行符, 也会保留末尾的换行
# `>` 不保留行尾换行符, 但会保留末尾的换行. 若中间需要换行符, 留空行即可.
# `|+` 保留末尾的换行, 也是默认行为
# `|-` 不保留末尾的换行
# `>+`
# `>-`
str6: |
添加标识符号的
前面对其的缩进会被会被去掉
但是, 已经对其的缩进差异会被保留. 比如这一行
符合类型
以上所有类型可以混合使用. 等等吧, 大家都懂得
# 数组的元素是哈希
list:
- name: Name1
age: 10
- name: Name2
age: 20
# 哈希的值是数组
hash:
hashList: [V1, V2]
特殊用法
锚点复制
用于对相同的内容进行复用.
names:
- name: &name1 XiaoMing
# 这里引用上方的锚点, 既 &name1
- name: *name1
# 复制对象
user1: &user1
name: XiaoMing
age: 20
user2:
# 引用对象的值. << 表示将内容合并到当前.
# 其想过相当于: user3
<<: *user1
# 可以覆写引用的内容
age: 30
user3:
name: XiaoMing
age: 30
# 数组引用
ll:
- &list1
name: XiaoMing
age: 30
# 引用上面的数组元素
- *list1
标记分割
可以将多个yaml
配置写入到同一个文件中.
---
name: XiaoMing
# 三个点表示一个配置文件的结束
...
# 三个中横线标识一个配置文件的开头
# 一般使用`---`就可以不用再额外写 `...` 了
---
name: LiMing
...