Bash/sh:读取并保存yaml文件的根键数



我从这里使用脚本是为了读取一个包含我的系统的一些本地路径的yaml文件。脚本完成了预期的操作,但我也想记下有多少条路径。

YAML示例:

path1: ../
path2: /bin
path3: ../src

.sh示例:

#!/bin/bash
paths=0;
parse_yaml() {
local prefix=$2
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '34')
sed -ne "s|^($s):|1|" 
-e "s|^($s)($w)$s:$s["'](.*)["']$s$|1$fs2$fs3|p" 
-e "s|^($s)($w)$s:$s(.*)$s$|1$fs2$fs3|p"  $1 |
awk -F$fs '{
indent = length($1)/2;
vname[indent] = $2;
echo $indent
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length($3) > 0) {
vn=""; for (i=0; i<indent; i++) {
vn=(vn)(vname[i])("_")
}
printf("%s%s%s="%s"n", "'$prefix'",vn, $2, $3);
printf(vn);
}
}'
}
eval $(parse_yaml paths.yaml)

echo $path1
echo $path2
echo $path3

输出:

../
/bin
../src

我希望在顶部声明的in-paths变量保存该yaml文件中声明的键数(换句话说,路径(。我试图在for循环中增加它,但没有成功。

如果不能使用正确的YAML解析器,一种选择是将路径读取到数组中:

IFS=$'n' read -r -d '' -a paths < <(awk '{print $2}' sample.yaml  && printf '')
printf "Number of paths: %sn" "${#paths[@]}" 

打印每条路径:

printf "%sn" "${paths[@]}"

最新更新