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

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. :-)



#!/bin/bash

function push(){
        # legt ein Element auf den Stack
        # $1 Stackname
        # $2 Wert
        eval "${1}+=( \"${2}\" )"
}

function pop(){
        # gibt das letzte Element eines Stacks aus
        # und löscht dieses
        # $1 name des Stacks
        # Beispiel: pop "stack"
        local max name value
        eval max=\${#${1}[@]}
        (( max-- ))
        eval value="\${${1}[max]}"
        echo "${value}"
        delete_from_stack "${1}" "${max}"
}

function delete_from_stack(){
        # Löscht von einem Stack einen Listenplatz
        # $1 name des Stacks
        # $2 stackplatz. Achtung: Start bei 0
        # Beispiel: delete_from_stack "stack" 3
        #               löscht den vierten Stackeintrag von "stack"
        local new_stack=() max i value line
        eval max=\${#${1}[@]}
        for((i=0;i<max;i++)); do
                if [ $2 -ne $i ]; then
                        name="\${${1}[$i]}"
                        eval value="${name}"
                        new_stack+=( "${value}" )
                fi
        done
        unset $1
        line="eval $1=( \"\${new_stack[@]}\" )"
        $line
}

function print_stack(){
        # gibt den Inhalt eines Stacks zeilenweise aus
        # $1 name des stacks
        # Beispiel: print stack
        local max i value name
        eval max=\${#${1}[@]}
        for((i=0;i<max;i++)); do
                name="\${${1}[$i]}"
                eval value="${name}"
                echo "${value}"
        done
}

unset stack

echo "Ein kleiner Test mit der Variablen 'stack'."
echo "Wir fügen hinzu: 0A, 1B, 2C 2C, 3D DD DD, 4E 4E"
push stack "0A"
push stack "1B"
push stack "2C 2C"
push stack "3D DD DD"
push stack "4E 4E"

echo "Der Stack ist nun:"
print_stack stack

echo "Wir löschen Element 1 (Position2) vom Stack."
delete_from_stack "stack" 1
echo "Der Stack ist nun:"
print_stack stack

echo "POP - Zeige/Nehme das letzte Element vom Stack."
pop stack
echo "Stack ist nun:"
print_stack stack


Und nun die Ausgabe auf dem Bildschirm.


Ein kleiner Test mit der Variablen 'stack'.
Wir fügen hinzu: 0A, 1B, 2C 2C, 3D DD DD, 4E 4E
Der Stack ist nun:
0A
1B
2C 2C
3D DD DD
4E 4E
Wir löschen Element 1 (Position2) vom Stack.
Der Stack ist nun:
0A
2C 2C
3D DD DD
4E 4E
POP - Zeige/Nehme das letzte Element vom Stack.
4E 4E
Stack ist nun:
0A
2C 2C
3D DD DD

Keine Kommentare:

Aktuelles