Ksh-Referenzierung zusammengesetzter Variablen

Ksh-Referenzierung zusammengesetzter Variablen

Ich möchte die KSH-Funktion „Compound-Variable“ verwenden, um besser darzustellen, was im Code passiert.

Andererseits werden meine interessanten Werte in einem nummerierten Array gespeichert. Ich möchte zusammengesetzte Variablen wie folgt an einen Array-Repräsentanten binden

typeset -n person.name=person_arr[0]
typeset -n person.surname=person_arr[1]

Aber als Ergebnis bekam ich

ksh: typeset: person.name: is not an identifier

Die Frage ist, ob zusammengesetzte Variablen mit Variablenreferenzierung funktionieren und, wenn nicht, wie man int-indizierte Arrays eleganter verwenden kann.

Antwort1

NAME=0 SURNAME=1Die einfachste Antwort besteht jedoch darin, diese Variablen anstelle der Indizes 0 und 1 in Ihrem Array festzulegen und zu verwenden ...

Sie können das, was Sie wollen, auf eine ziemlich langwierige Art und Weise tun, indem SieDisziplinfunktionen. Für jede Variable kann eine Funktion set()definiert werden; sie wird jedes Mal aufgerufen, wenn die Variable geändert wird. Das Gleiche gilt für get(). Sie können also Folgendes tun:

#!/bin/ksh
typeset -C person
function person.name.set {
    person_arr[0]=${.sh.value}
}
function person.name.get {
    .sh.value=${person_arr[0]}
}
function person.surname.set {
    person_arr[1]=${.sh.value}
}
function person.surname.get {
    .sh.value=${person_arr[1]}
}

typeset -a person_arr
person_arr[0]=first   person_arr[1]=second
echo "name is ${person.name} ${person.surname}"

person.name=first2    person.surname=second2
echo "name is ${person.name} ${person.surname}"
echo "name is ${person_arr[@]}"

Dies deklariert eine zusammengesetzte Variable personund Disziplinfunktionen für die Unternamen .nameund .surname. Die set()Funktionen setzen den entsprechenden person_arrindizierten Wert auf den neuen Wert (in .sh.value), und die get()Funktionen „geben“ den entsprechenden indizierten Wert zurück, indem sie setzen .sh.value.

Das Beispiel setzt die Array-Version auf einen Wert und überschreibt sie dann mit den zusammengesetzten Namen. Die Ausgabe ist

name is first second
name is first2 second2
name is first2 second2

Wenn Sie mehrere Variablen haben, die Sie auf diese Weise binden möchten, sollten Sie nach einer Lösung suchen, dieIhr eigener KSH-Typ.

Antwort2

In ksh93passen zusammengesetzte Variablennamen und namerefsnicht zusammen, es funktioniert aber andersherum:

typeset -n First=person.name       
typeset -n Last=person.surname
person.name=John
person.surname=Doe
echo $First $Last
John Doe

verwandte Informationen