GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Assoziative Arrays in Shell-Skripten?

Ich habe einen Trick zum Implementieren assoziativer Arrays in einem Shell-Skript gesehen. Zum Beispiel print array["apples"] könnte als echo $array$key geschrieben werden wobei Schlüssel=Äpfel.

Es wurde jedoch nicht erwähnt, wie die Schlüssel zum Durchlaufen des Arrays generiert werden.
Die einzige Möglichkeit, die mir einfiel, war, die Schlüssel in einer durch Leerzeichen getrennten Variablen zu speichern, damit ich eine For-Schleife zum Durchlaufen verwenden konnte über das Array.

Gibt es also eine andere Möglichkeit, die Schlüssel für die spätere Verwendung zu speichern?

Akzeptierte Antwort:

Schalen mit assoziativen Arrays

Einige moderne Shells bieten assoziative Arrays:ksh93, bash ≥4, zsh. In ksh93 und bash, wenn a ein assoziatives Array ist, dann "${!a[@]}" ist das Array seiner Schlüssel:

for k in "${!a[@]}"; do
  echo "$k -> ${a[$k]}"
done

In zsh funktioniert diese Syntax nur im ksh-Emulationsmodus. Andernfalls müssen Sie die native Syntax von zsh verwenden:

for k in "${(@k)a}"; do
  echo "$k -> $a[$k]"
done

${(k)a} funktioniert auch, wenn a hat keinen leeren Schlüssel.

In zsh könnten Sie auch beide k durchlaufen eys und v Werte gleichzeitig:

for k v ("${(@kv)a}") echo "$k -> $v"

Schalen ohne assoziative Arrays

Assoziative Arrays in Shells zu emulieren, die sie nicht haben, ist viel mehr Arbeit. Wenn Sie assoziative Arrays benötigen, ist es wahrscheinlich an der Zeit, ein größeres Tool wie ksh93 oder Perl einzuführen.

Wenn Sie assoziative Arrays in einer reinen POSIX-Shell benötigen, können Sie sie hier simulieren, wenn Schlüssel darauf beschränkt sind, nur die Zeichen 0-9A-Z_a-z zu enthalten (ASCII-Ziffern, Buchstaben und Unterstrich). Unter dieser Annahme können Schlüssel als Teil von Variablennamen verwendet werden. Die folgenden Funktionen wirken auf ein Array, das durch ein Namenspräfix, den „Stamm“, identifiziert wird, der nicht zwei aufeinanderfolgende Unterstriche enthalten darf.

## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
  eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
  eval "echo "$__aa__${1}""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
  eval "unset $3
        case $__aa__${1} in
          *" $2 "*) $3=$__aa__${1}__$2;;
        esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
  eval "__aa__${1}__${2}=$3
        case $__aa__${1} in
          *" $2 "*) :;;
          *) __aa__${1}="${__aa__${1}}$2 ";;
        esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
  eval "unset __aa__${1}__${2}
        case $__aa__${1} in
          *" $2 "*) __aa__${1}="${__aa__${1}%%* $2 } ${__aa__${1}#* $2 }";;
        esac"
}

(Warnung, ungetesteter Code. Fehlererkennung für syntaktisch ungültige Stämme und Schlüssel ist nicht vorgesehen.)

Verwandte:Linux – langsame Medien – Disk-Cache-Tuning?
Linux
  1. Setuid für Shell-Skripte zulassen?

  2. Richtiges Sperren in Shell-Skripten?

  3. Arrays in der Unix-Bourne-Shell?

  4. Wie lösche ich Root-Rechte in Shell-Skripten?

  5. Passwort in Shell-Skripten verstecken?

So erstellen Sie Shell-Skripte

Arrays in Shell-Skripten

Wie verwende ich if-else in Shell-Skripten?

Die for-Schleife in Shell-Skripten verstehen

Die While-Schleife in Shell-Skripten

Befehlszeilenparameter in Shell-Skripten