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=1
Die 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 person
und Disziplinfunktionen für die Unternamen .name
und .surname
. Die set()
Funktionen setzen den entsprechenden person_arr
indizierten 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 ksh93
passen zusammengesetzte Variablennamen und namerefs
nicht 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