如何在Shell脚本中读取YAML文件中的特定数据
从YAML文件中提取特定键值到Shell变量的方案
在Shell脚本里处理YAML文件,不推荐用awk/sed这类文本工具硬匹配——YAML的缩进、注释、嵌套结构很容易让正则失效。最稳妥的方式是用专门的YAML处理工具,比如yq,下面给你两种可行的实现方式:
方案一:使用yq(推荐,精准可靠)
yq是YAML版本的jq,专门用来处理YAML/JSON数据,语法直观且能完美适配YAML的结构。
1. 安装yq
- Ubuntu/Debian系统:
sudo apt install yq - macOS系统:
brew install yq - 其他系统可以从官方仓库下载二进制包
2. 脚本实现
#!/bin/bash # 提取test.config.abc和test.config.xyz的值 var1=$(yq '.test.config.abc' test.yaml) var2=$(yq '.test.config.xyz' test.yaml) # 验证变量(可选) echo "var1 = $var1" echo "var2 = $var2"
说明:yq的语法和jq一致,.test.config.abc就是直接定位到目标键,完全不受文件中其他无关内容的影响,哪怕YAML结构有嵌套变化(只要目标键的路径不变),脚本依然能正常工作。
注意:如果你的
yq是v3版本(旧版),语法会略有不同,需要写成:var1=$(yq r test.yaml test.config.abc) var2=$(yq r test.yaml test.config.xyz)
方案二:使用awk(应急方案,仅适用于格式严格的YAML)
如果无法安装yq,可以用awk做临时提取,但要求你的YAML格式完全固定(比如abc:和xyz:前面的空格数必须和示例一致,没有注释干扰):
#!/bin/bash # 匹配特定缩进下的abc和xyz字段 var1=$(awk '/^ abc: / {print $2}' test.yaml) var2=$(awk '/^ xyz: / {print $2}' test.yaml) echo "var1 = $var1" echo "var2 = $var2"
局限性:如果YAML的缩进改变、目标字段有注释、或者值是多行/特殊字符,这个方法会直接失效,所以仅作为应急使用。
内容的提问来源于stack exchange,提问作者anonymous user
相关产品推荐
相关产品推荐

