-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathknf-parser.sh
More file actions
61 lines (49 loc) · 1.59 KB
/
knf-parser.sh
File metadata and controls
61 lines (49 loc) · 1.59 KB
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
#!/bin/bash
## KNF PARSER ##################################################################
# Reads configuration in KNF format and declare properties from it
#
# 1: Path to configuration file (String)
#
# Code: Yes
# Echo: No
parseKNF() {
local knf="${1//\~/$HOME}"
local knf_app knf_line knf_sec knf_prop knf_val knf_macro
if [[ ! -r "$knf" ]] ; then
echo "File $knf is not exist or not readable" 1>&2
return 1
fi
for knf_app in "echo" "cut" "sed" "tr" "grep" ; do
if ! type -P "$knf_app" &> /dev/null ; then
echo "KNF parsing requires $knf_app utility" 1>&2
return 1
fi
done
while read knf_line ; do
if [[ $knf_line =~ \[([a-zA-Z0-9_-]+)\] ]] ; then
knf_sec="${BASH_REMATCH[1]}"
continue
fi
if [[ $knf_line =~ ^[\ \t]*([a-zA-Z0-9_-]+): ]] ; then
knf_prop="${BASH_REMATCH[1]//-/_}"
else
echo "File $knf is misformatted" 1>&2
return 1
fi
knf_prop=$(echo "$knf_prop" | tr '[:upper:]' '[:lower:]')
knf_val=$(echo "$knf_line" | cut -f2-99 -d':' | sed 's/^ *//g' | sed 's/^\t*//g' | sed 's/ *$//g')
if [[ -z "$knf_val" || "$knf_val" == "false" ]] ; then
continue
fi
while : ; do
if [[ "$knf_val" =~ \{([a-zA-Z0-9_-]+:[a-zA-Z0-9_-]+)\} ]] ; then
knf_macro="${BASH_REMATCH[1]/:/_}"
knf_val="${knf_val//${BASH_REMATCH[0]}/${!knf_macro}}"
else
break
fi
done
declare -g "${knf_sec}_${knf_prop}"="$knf_val"
done < <(grep -Pv '^[ ]*(#(?!\!)|[ ]*$)|false[ ]*$' "$knf")
}
################################################################################