Moin,
falls ich diesen Thread im falschen Bereich eingefügt habe, bitte nicht sauer sein und verschieben.
Ich habe mir etwas recht Umfangreiches vorgenommen und stehe aktuell noch am Anfang. Ich arbeite mich gerade in verschiedenste Shells (bash, dash, ksh, mksh, posh, sh, zsh) ein. Bash funktioniert schon ganz gut. Die Problematik besteht in den teils feinen Unterschieden zwischen den verschiedenen Shells.
Was ich eigentlich vorhabe!
Ich versuche mir ein Script zu erstellen, welches ich in meine zukünftigen Projekte einbinden kann. Dieses soll ermöglichen, dass das Hauptscript auf möglich vielen Shells genutzt werden kann.
Aktuell befasse ich mich mit den Arrays und Dictionaries, welche teils nicht von den Shells unterstützt werden.
Es geht vorrangig darum, die Machbarkeit zu prüfen. Dass ich aktuell noch viel mit eval arbeite, ist natürlich auch noch eine Baustelle und soll auch noch gelöst werden.
Die folgende Tabelle ist hoffentlich nachvollziehbar und erläutert die gewünschten Ziele der Funktion ARRAY.
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 | Funkt. Name Option Richt. Anzahl Elemente variabel Reihenfolge beliebig Auswahlbereich von 1 – n 1. Element n. Element --------------------------------------------------------------------------------------------------------------- Erstelle Array mit Elementen im Bereich und gleichem Wert Wenn vorhanden ersetze ARRAY arrayname -c y [1] ′- … [n] “value” Erstelle Array mit Elementen und gleichem Wert Wenn Array vorhanden wird dieses ersetzt ARRAY arrayname -c y [1] ′+ … [n] “value” Erstelle Array mit Elementen und Werten Wenn Array vorhanden wird dieses ersetzt ARRAY arrayname -c y [1] “value_1” ′+ … [n] “value_n” Erstelle Elemente mit Werten Wenn vorhanden ersetze alte Werte ARRAY arrayname -c [1] “value_1” … [n] “value_n” Erstelle Array Wenn vorhanden ersetze mit leerem Array ARRAY arrayname -c Lösche Elemente im Bereich ARRAY arrayname -r [1] ′- … [n] Lösche Elemente ARRAY arrayname -r [1] … [n] Lösche Array ARRAY arrayname -r Ergänze Elemente im Bereich um gleichen Wert ARRAY arrayname (y) [1] ′- … [n] “value” Ergänze Elemente um gleichen Wert ARRAY arrayname (y) [1] ′+ … [n] “value” Ergänze Elemente um Wert ARRAY arrayname (y) [1] “value_1” … [n] “value_n” Ausgeben Elemente im Bereich als Liste ARRAY arrayname y [1] ′- … [n] Ausgeben Elemente als Liste ARRAY arrayname y [1] … [n] Ausgeben Array als Liste ARRAY arrayname y Ausgeben Länge für Elemente im Bereich als Liste ARRAY arrayname -l [1] ′- … [n] Ausgeben Länge für Element als Liste ARRAY arrayname -l [1] … [n] Ausgeben Länge für Array ARRAY arrayname -l Ausgeben Arrayschlüssel Elemente im Bereich als Liste wenn vorhanden ARRAY arrayname -k (y) [1] ′- … [n] Ausgeben Arrayschlüssel Elemente als Liste wenn vorhanden ARRAY arrayname -k (y) [1] … [n] Ausgeben Arrayschlüssel als Liste ARRAY arrayname -k (y) |
Hier nun der bisherige Code:
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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | set -eu # currently used Shell / aktuell verwendete Shell shell_pid=$$ ; shell_name=$( ps -o command= -p $shell_pid | cut -d" " -f1 ) printf "shell_name: $shell_name\n" ARRAY () { echo argumente: $* arrayname=$1; shift #echo argument: ${1-} arrayoption= case ${1-} in -c) arrayoption=cre; shift;; -r) arrayoption=rem; shift;; -l) arrayoption=len; shift;; -k) arrayoption=key; shift;; esac #echo argument: ${1-} arrayorder= case ${1-} in -a) arrayorder="-a"; shift;; -d) arrayorder="-d"; shift;; -s) arrayorder="-s"; shift;; esac if [ "$arrayoption" = "rem" ] || [ "$arrayoption" = "len" ]; then arrayorder=; fi echo arrayname: ${arrayname} echo arrayorder: ${arrayorder-} arrayrest=${*-} #echo arrayrest: $arrayrest unsetlist="arrayname arrayoption arrayorder arrayrest" cpos=0 if [ -n "$arrayrest" ]; then for i in $( echo "$arrayrest" ); do case "$i" in \[*\]) case "$shell_name" in zsh) cpos=$(( $cpos + 1 )); d=${i%]} eval "position_${cpos}=\"${d#'['}\""; unsetlist="$unsetlist position_${cpos}" echo "position_${cpos}: $( eval echo \${position_${cpos}} )" ;; *) cpos=$(( $cpos + 1 )); d=${i%]} eval "position_${cpos}=\"${d#[}\""; unsetlist="$unsetlist position_${cpos}" echo "position_${cpos}: $( eval echo \${position_${cpos}} )" ;; esac ;; ′-|′+) eval "event_${cpos}=\"${i}\"" unsetlist="$unsetlist event_${cpos}" echo "event_${cpos}: $( eval echo \${event_${cpos}} )" ;; *) eval "value_${cpos}=\"$( eval echo \${value_${cpos}-} ) ${i}\"" unsetlist="$unsetlist value_${cpos}" echo "value_${cpos}: $( eval echo \${value_${cpos}} )" ;; esac done fi case ${arrayoption-} in cre) echo arrayoption: $arrayoption if [ "$cpos" -gt 0 ]; then arrayrange=1 if [ "$cpos" -gt 1 ]; then arrayrange=$( echo "{1..$cpos}" ) fi echo arrayrange: $arrayrange unsetlist="$unsetlist arraykeys arrayrange" case "$shell_name" in dash|sh) for i in $arrayrange; do eval "${arrayname}_$( eval echo \${position_${i}} )=\"$( eval echo \${value_${i}-} )\""; arraykeys="${arraykeys-} $( eval echo \${position_${i}} )" echo "${arrayname}_$( eval echo \${position_${i}} ): $( eval echo \${${arrayname}_$( eval echo \${position_${i}} )} )" done ;; zsh) for i in $arrayrange; do echo "${arrayname}[$( eval echo \${position_${i}} )]=\"$( eval echo \${value_${i}-} )\""; eval echo "${arrayname}[$( eval echo \${position_${i}} )]=\"$( eval echo \${value_${i}-} )\""; arraykeys="${arraykeys-} $( eval echo \${position_${i}} )" echo \${$( echo \${${arrayname}[$( eval echo \${position_${i}} )]} )} done ;; *) for i in $arrayrange; do eval "${arrayname}[$( eval echo \${position_${i}} )]=\"$( eval echo \${value_${i}-} )\""; arraykeys="${arraykeys-} $( eval echo \${position_${i}} )" echo "${arrayname}[$( eval echo \${position_${i}} )]: $( eval echo \${${arrayname}[$( eval echo \${position_${i}} )]} )" done ;; esac fi eval "${arrayname}_=\"$cpos ${arrayorder:--a} ${arraykeys-0}\""; echo "${arrayname}_: $( eval echo \${${arrayname}_} )" ;; # esac unset $( echo $unsetlist ) } # ARRAY arr -c ARRAY arr -c -a "[5] eins" # ′+ [3] zwei [2] drei [4] vier ′- [1] fünf" # ARRAY arr -c -d "[5] eins ′+ [3] zwei [2] drei [4] vier ′- [1] fünf" # ARRAY arr -c -s "[5] eins ′+ [3] zwei [2] drei [4] vier ′- [1] fünf" # ARRAY arr -r "[2] [1]" # ARRAY arr -r -a "[5]" # ARRAY arr -l # ARRAY arr -l -s # ARRAY arr -k # ARRAY arr -k -a # ARRAY arr -k -d # ARRAY arr -k -s # ARRAY arr "[1]" # ARRAY arr "[1] 123" # ARRAY arr |
Für echo habe ich aktuell folgenden Code, Wobei die Verfügbarkeit des externen echo-Befehls noch fehlt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # exit if any command fails or variables/arrays are not set / beendet wenn irgend ein Kommando scheitert oder Variablen/Arrays nicht gesetzt sind set -eu # used internal field separators / genutzte interne Feldseperatoren #---- IFSold=${IFS} IFSnew=$'\n\t' IFS=$IFSnew ECHO () { IFS=$IFSold case "$shell_name" in bash|ksh) echo $*;; dash|posh|sh) case "${1:-}" in -en) shift; echo -n $*;; -e) shift; echo $*;; -n) /bin/echo -n $*;; *) /bin/echo $*;; esac;; *) /bin/echo $*;; esac IFS=$IFSnew } |
Ich hoffe, Ihr habt Ideen und ich kann noch was lernen.
Danke schon jetzt!
Bearbeitet von rklm:
Syntaxhighlighting. Bitte bekannte Namen für Syntax benutzen