BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT

Sonntag, 15. November 2020

BASH und JSON-Strings
Ein Erfahrungsbericht...

 ....so oder ähnlich könnte es nun heissen.
Das Problem war eigentlich, nur "mal eben" einen JSON-String ohne zusätzliche Tools "menschlich lesbar" anzuzeigen.
"Da muss doch schon mal wer was ordentliches gemacht haben?"

Nach ca. 2 Stunden suchen hatte ich jedoch immer noch nichts wirklich funktionierendes gefunden, was einen JSON-String "ordentlich" menschlich visualisiert - 
oder auch ggf. aus einem JSON-String einen Variablen-Bereich einfach wieder heraus gibt.

Na dann... bau ich da mal halt selbst - 

Auf geht's :-)

#!/bin/bash # # Funktionen zum Umgang mit JSON-Strings. # # 2020-11-13 Oliver Lenz    Initial # function parse_jsonvar_raw() { # Parse einen JSON-String in menschlich lesbare form. # # $1 JSON-String # $2 Tabulatorenweite (default:4) (optional) # $3 Filtere die Ausgabe anhand eines Variablennamens (optional), z.B. "value.name" # local buchstabe="" letzter_buchstabe="" zeile="" local in_gaensefuesschen=0 umbruch="" local variablenname="" variablenstack=() local ebene=0 anschlag=0 local tabbreite=4 filter="" zurueck=0 if [ $# -gt 1 ]; then [[ "${2}" =~ (^[0-9]*$) ]] && tabbreite=$2 || filter=".${2}" fi [ $# -gt 2 ] && filter=".${3}" function vartest() { local voller_variablenname="" i=0 s [ -n "${variablenname}" ] && variablennamenstack[${ebene}]="${variablenname}" voller_variablenname="" for((i=0;i<=${ebene};i++)){ s="${variablennamenstack[$i]#\"}" s="${s%\"}" voller_variablenname="${voller_variablenname}.${s}" } # printf "%-60s" "${voller_variablenname}" if [[ -z "${filter}" || "${filter}" == "${voller_variablenname}" || "${voller_variablenname:0:$((${#filter}+1))}" == "${filter}." ]]; then [ "${filter}" == "${voller_variablenname}" ] && zurueck=$ebene # korrektur bei Filter (( i=$anschlag-$zurueck*tabbreite )) [ ${i} -gt 0 ] && printf "%${i}s" " " [ -n "${zeile}" ] && echo "${zeile}" fi variablenname="" zeile="" } while read -n1 buchstabe; do if [ "${in_gaensefuesschen}" == "1" ]; then [ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ] && in_gaensefuesschen="0" elif [ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ]; then in_gaensefuesschen="1" else case "${buchstabe}" in '{' | '[' | '(' | ',' ) umbruch="nach_buchstaben";; '}' | ']' | ')' ) umbruch="vor_buchstaben";; ':') variablenname="${zeile}";; ' ') buchstabe="";; esac fi [ "${umbruch}" == "vor_buchstaben" ] && vartest && (( ebene-- )) zeile="${zeile}${buchstabe}" [ "${umbruch}" == "vor_buchstaben" ] && (( anschlag=ebene*tabbreite )) if [ "${umbruch}" == "nach_buchstaben" ]; then vartest [ "${buchstabe}" != "," ] && (( ebene++ )) (( anschlag=ebene*tabbreite )) fi letzer_buchstabe="${buchstabe}" umbruch="" done<<<"${1}" [ -n "${zeile}" ] && vartest } function parse_jsonvar(){ ausgabe="$( parse_jsonvar_raw "${1}" "${2}" "${3}" )" [ -n "${ausgabe}" ] && echo "${ausgabe%,}" } # json_str='value:{"name":"Hello World","myNumArray":{"index0":"Hello","varname":"value","some":"thing"}}' # parse_jsonvar "${json_str}" # parse_jsonvar "${json_str}" 8 # parse_jsonvar "${json_str}" 4 "value" # parse_jsonvar "${json_str}" 4 "value.name" # parse_jsonvar "${json_str}" 4 "value.myNumArray"

Geht doch... :-)

Donnerstag, 12. November 2020

Arrays bzw. Stacks mit der BASH-Shell

Wer Scripte in der BASH-Shell schreibt, der hat hin und wieder sehr unangenehme Erfahrungen mit Arrays:  Ist man hier nicht sehr genau in der Syntax, gehen Einträge verloren, oder man erhält Null-Einträge.

Anbei eine Idee, wie man das Problem mit üblichen Funktionen wie

  "push" (etwas auf den Stack legen),  
  "pop" (das letzte Element vom Stack zeigen und löschen),
  "delete_from_stack" (ein gezieltes Element vom Stack löschen) und
  "print_stack" (gebe einen Stack aus)

lösen kann.

Viel Spaß damit. :-)

Aktuelles