-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathshell_map.sh
executable file
·90 lines (80 loc) · 2.72 KB
/
shell_map.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
79
80
81
82
83
84
85
86
87
88
89
90
#!/bin/bash
carp () {
echo "shell_map.sh: ERROR: $1" 1>&2
return 1
}
shell_map () {
local METHOD="$1"
[ -z "$METHOD" ] && { carp "argument <METHOD> cannot be empty. Usage: shell_map <METHOD> [arg1] [arg2]." ; return; }
case $METHOD in
new)
local NEW_MAP="$2"
[ -z "$NEW_MAP" ] && { carp "new(): argument <MAP_NAME> cannot be empty. Usage: shell_map new <MAP_NAME>."; return; }
# loads function declaration
test -n "$(declare -f shell_map)" || return
# declares in the Global Scope a copy of this function with a new name.
eval "${_/shell_map/$NEW_MAP}"
;;
put)
local KEY="$2"
[ -z "$KEY" ] && { carp "put() KEY cannot be empty."; return; }
[[ "$KEY" =~ [^a-zA-Z0-9_] ]] && { carp "put() KEY '$KEY' isn't valid. Valid KEY names can be letters, digits and underscores."; return; }
local VALUE="$3"
# declares a variable in the global scope
eval ${FUNCNAME}_DATA_${KEY}='$VALUE'
;;
get)
local KEY="$2"
local VALUE="${FUNCNAME}_DATA_${KEY}"
printf '%s' "${!VALUE}"
;;
keys)
declare | grep -Po "(?<=${FUNCNAME}_DATA_)\w+((?=\=))"
;;
name)
echo $FUNCNAME
;;
contains_key)
local KEY="$2"
[ -z "$KEY" ] && { carp "contains_key() KEY cannot be empty."; return; }
compgen -v ${FUNCNAME}_DATA_${KEY} > /dev/null && return 0 || return 1
;;
clear_all)
while read var; do
unset $var
done < <(compgen -v ${FUNCNAME}_DATA_)
;;
remove)
local KEY="$2"
[ -z "$KEY" ] && { carp "remove() KEY cannot be empty."; return; }
unset ${FUNCNAME}_DATA_${KEY}
;;
size)
compgen -v ${FUNCNAME}_DATA_${KEY} | wc -l
;;
put_increment)
local KEY="$2"
[ -z "$KEY" ] && { carp "put_increment() KEY cannot be empty."; return; }
[[ "$KEY" =~ [^a-zA-Z0-9_] ]] && { carp "put_increment() KEY '$KEY' isn't valid. Valid KEY names can be letters, digits and underscores."; return; }
local NUMBER="$3"
[ -z "$NUMBER" ] && { carp "put_increment() NUMBER cannot be empty."; return; }
[[ "$NUMBER" =~ [^0-9] ]] && { carp "pub_increment() NUMBER '$NUMBER' must be digits."; return; }
((${FUNCNAME}_DATA_${KEY}+=$NUMBER))
return 0
;;
put_append)
local KEY="$2"
local VALUE="$3"
local OLD_VALUE=""
if $FUNCNAME contains_key $KEY ; then
REF="${FUNCNAME}_DATA_${KEY}"
OLD_VALUE="${!REF}"
fi
$FUNCNAME put $KEY "$OLD_VALUE$VALUE"
;;
*)
carp "unsupported operation '$1'."
return 1
;;
esac
}