-
Notifications
You must be signed in to change notification settings - Fork 9
/
yaml.sh
78 lines (67 loc) · 2.12 KB
/
yaml.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env bash
# shellcheck disable=SC1003
# Based on https://gist.github.com/pkuczynski/8665367
# Source: https://github.com/jasperes/bash-yaml/blob/master/script/yaml.sh
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 -e '/- [^\“]'"[^\']"'.*: /s|\([ ]*\)- \([[:space:]]*\)|\1-\'$'\n'' \1\2|g' |
sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
-e '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' |
awk 'BEGIN {
FS="=";
OFS="="
}
/(-|\.).*=/ {
gsub("-|\\.", "_", $1)
}
{ print }'
) < "$yaml_file"
}
unset_variables() {
# Pulls out the variable names and unsets them.
#shellcheck disable=SC2048,SC2206 #Permit variables without quotes
local variable_string=($*)
unset variables
local variables=()
local tmpvar
local variable
for variable in "${variable_string[@]}" ; do
tmpvar=$(echo "$variable" | grep '=' | sed 's/=.*//' | sed 's/+.*//')
variables+=("$tmpvar")
done
for variable in "${variables[@]}"; do
if [ -n "$variable" ] ; then
unset "$variable"
fi
done
}
create_variables() {
local yaml_file="$1"
local prefix="$2"
local yaml_string
yaml_string="$(parse_yaml "$yaml_file" "$prefix")"
unset_variables "${yaml_string}"
eval "${yaml_string}"
}