读取yaml文件的shell脚本

脚本如下:

#!/bin/bash
function parse_yaml() {
local yaml_file=$1
local prefix=$2
local s
local w
local fs
s='[[:space:]]*'
w='[a-zA-Z0-9_.-]*'
fs="$(echo @|tr @ '\034')"
(
sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/\s*$//g;' \
-e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
-e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
-e "s|^\($s\)\($w\)$s[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
awk -F"$fs" '{
indent = length($1)/2;
if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
vname[indent] = $2;
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=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1],$3);
}
}' |
sed -e 's/_=/+=/g' \
-e '/\..*=/s|\.|_|' \
-e '/\-.*=/s|\-|_|'
) < "$yaml_file"
}
function create_variables() {
local yaml_file="$1"
eval "$(parse_yaml "$yaml_file")"
}

使用

脚本提供了两个函数:

  • parse_yaml:读取yaml文件并直接输出结果。
  • create_variables:读取yaml文件,基于yaml文件的内容创建变量。

示例

parse_yaml file.yml && echo
create_variables file.yml

来源:https://github.com/jasperes/bash-yaml

版权声明:著作权归作者所有。

相关推荐

Ruby调用shell脚本总结

Ruby可以使用以下几种方法来执行shell脚本。1、使用反引号``调用shell脚本语法`cmd` 返回命令的结果示例`echo "hello"` 2、内置语法%x( cmd ) 其中%x后面为分隔符,上面使用了(作为分隔符,当遇到收括号即表示命令结束。这些分隔符可以为[,{等。示例%x( echo 'hello' 

Shell:如何在awk脚本里使用变量

在awk里用变量最好的方法是使用-v选项。使用方式awk -v var= 单个变量~]$ v1="变量1" ~]$ awk -v var1="$v1" 'BEGIN {print var1}' 变量1 多个变量使用多个-v var=xxx来接收多个变量~]$&

Linux Shell脚本里的单引号和双引号的区别

双引号在Shell脚本里,双引号里的字符,除$、\、’、和”这几个字符是特殊字符并保留其特殊功能外,其余字符作为普通字符对待。在双引号内支持内插变量,使用$符号表示。支持内插转义,使用反斜杠\做转,对于在双引号内的"需要使用反斜杠转义。单引号在Shell脚本里,单引号内的字符都为普通字符,不支持内插任何东西,即使是使用反斜杠对单引号做的转义也不行。示例:#!/bin/sh MYVAR=t

Linux shell命令监控文件的变化

1、tail:监控文件的实时更新tail -f logfile.log 2、watch:定时执行命令并输出命令内容,对于有改变的输出会以高亮的方式显示watch -n 10 -d ls -l /var/ -n:设置每隔多少秒执行指定的命令-d:设置执行的命令示例里是每10秒执行ls命令。

Linux shell脚本获取命令行的输出

在Linux使用命令替换来获取命令行的输出命令替换格式:$(command) 或者`command` 这里的`为反引号。示例OUTPUT="$(ls -1)" echo "${OUTPUT}" 参考:Bash Reference Manual