X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=sh%2Fjshn.sh;h=a15cb00be9f7410e6a2984f6827e666fd1e48f50;hp=d3254606d3d766f14be34f6e8bfb2d7689d4f7fc;hb=66308641bfb2940914c41ca33e8df672d63790bd;hpb=738884e7469969a0b30a077820f60ff0a1e37ac2 diff --git a/sh/jshn.sh b/sh/jshn.sh index d325460..a15cb00 100644 --- a/sh/jshn.sh +++ b/sh/jshn.sh @@ -24,7 +24,7 @@ json_add_generic() { var=$(( ${aseq:-0} + 1 )) export -- "SEQ_$cur=$var" else - local name="$(echo -n "$var" | tr -C '[a-zA-Z_]' _)" + local name="${var//[^a-zA-Z0-9_]/_}" [[ "$name" == "$var" ]] || export -- "NAME_${cur}_${name}=$var" var="$name" fi @@ -94,14 +94,21 @@ json_dump() { json_get_type() { local dest="$1" - local var="$2" - eval "export -- \"$dest=\${TYPE_${JSON_CUR}_$var}\"" + local var="TYPE_${JSON_CUR}_$2" + eval "[ -n \"\${$var+x}\" ] && export -- \"$dest=\${$var}\"" } json_get_var() { local dest="$1" - local var="$(echo -n "$2" | tr -C '[a-zA-Z_]' _)" - eval "export -- \"$dest=\${${JSON_CUR}_$var}\"" + local var="${JSON_CUR}_${2//[^a-zA-Z0-9_]/_}" + eval "[ -n \"\${$var+x}\" ] && export -- \"$dest=\${$var}\"" +} + +json_get_vars() { + while [ "$#" -gt 0 ]; do + local _var="$1"; shift + json_get_var "$_var" "$_var" + done } json_select() { @@ -110,11 +117,11 @@ json_select() { [ -z "$1" ] && { JSON_CUR="JSON_VAR" - return + return 0 } [[ "$1" == ".." ]] && { eval "JSON_CUR=\"\${UP_$JSON_CUR}\"" - return; + return 0 } json_get_type type "$target" case "$type" in @@ -123,6 +130,7 @@ json_select() { ;; *) echo "WARNING: Variable '$target' does not exist or is not an array/object" + return 1 ;; esac }