YAML

YAML介绍

YAML是一个可读性高的用来表达资料系列的格式。YAML参考了其他多种语言,包括XML,C语言,Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。其特性:

YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好

语法规则

它的基本语法规则如下:

  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 缩进时不允许使用 Tab 键,只允许使用空格
  4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

基本的 YAML

对于 Ansible, 每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以, 我们需要知道如何在 YAML 中编写列表和字典.

YAML 还有一个小的怪癖. 所有的 YAML 文件(无论和 Ansible 有没有关系)开始行都应该是 ---. 这是 YAML 格式的一部分, 表明一个文件的开始.

---
# 一个美味水果的列表
- Apple
- Orange
- Strawberry
- Mango

一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):

---
# 一位职工的记录
name: Example Developer
job: Developer
skill: Elite

字典也可以使用缩进形式来表示, 如果你喜欢这样的话:

---
# 一位职工的记录
{name: Example Developer, job: Developer, skill: Elite}

Ansible并不是太多的使用这种格式, 但是你可以通过以下格式来指定一个布尔值(true/fase):

---
create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false

组合

---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
    - Apple
    - Orange
    - Strawberry
    - Mango
languages:
    ruby: Elite
    python: Elite
    dotnet: Lame

Gotchas

语法错误

foo: somebody said I should put a colon here: so I did

正确的是使用引号来包裹任何包含冒号的哈希值

foo: "somebody said I should put a colon here: so I did"

此外, Ansible 使用 “{{ var }}” 来引用变量. 如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须引用它, 像这样:

foo: "{{ variable }}"

也可以将key:value放置于{}中进行表示,例如:

 ---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}

这里#也代表注释

数据合并

为了维持文件的简洁,并避免数据输入的错误,YAML提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作(可以参考上面"ship-to"的示例)合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中。

当数据被instantiate合并和参考会被剖析器自动展开。

    ---
    - step:  &id001                  # 定义锚点 &id001
        instrument:      Lasik 2000
        pulseEnergy:     5.4
        pulseDuration:   12
        repetition:      1000
        spotSize:        1mm
    
    - step:
         <<: *id001                  # 合併鍵值:使用在锚点定义标记的內容
         spotSize:       2mm         # 覆盖"spotSize"键值
    
    - step:
         <<: *id001                  # 合并键值:使用在锚点定义标记的內容
         pulseEnergy:    500.0       # 覆盖键值
         alert: >                    # 加入其他键值
               warn patient of 
               audible pop

数据类型

---
a: 123                     # 整数
b: "123"                   # 字串(使用双括号)
c: 123.0                   # 浮点数
d: !!float 123             # 浮点数,使用!!表达的严格形态
e: !!str 123               # 字串,使用严格形态
f: !!str Yes               # 字串,使用严格形态
g: Yes                     # 布林值"真"
h: Yes we have No bananas  # 字串(包含"Yes"和"No")

在 YAML 中用 ~ 符号来表示 Null 字符

YAML 中的字符串可以用单引号(''),也可用双引号(""),也可以不用引号来表示
至于区别是在双引号里可以实别转义字符,在单引号里不行

# 这里是 yaml.ym 文件

string1: "abcd\nefg"
string2: 'abcd\nefg'
string3: abcd\nefg

# 这是解析后的内容
[root@localhost www.study.com]# php index.php 
Array
(
    [string1] => abcd
efg
    [string2] => abcd\nefg
    [string3] => abcd\nefg

一般情况下,我们用 YAML 就是做配置文件,也不会涉及转义,可以直接不用引号就行。如果字符串太长,也可以直接换行,但是新行前要有空格

你可能感兴趣的:(YAML)