Ksh 複合變數引用

Ksh 複合變數引用

我想使用稱為複合變數的 KSH 功能來更好地顯示程式碼中發生的情況。

另一方面,我的有趣值保存在數字組織數組中。我想將複合變數綁定到數組代表,如下所示

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

但結果我得到了

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

問題是複合變數是否可以與變數引用一起使用,如果不能,如何以更優雅的方式使用 int 索引數組。

答案1

最簡單的答案是設定NAME=0 SURNAME=1和使用這些變數而不是數組中的 0 和 1 索引,但是...

你可以用一種相當冗長的方式做你想做的事紀律職能。每個變數都可以有一個set()為其定義的函數;每次變數更改時都會呼叫它。同樣對於get().因此您可以執行以下操作:

#!/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[@]}"

這宣告了一個複合變數person以及子名稱.name和 的規則函數.surname。這些set()函數將適當的person_arr索引值設為新值(在 中.sh.value),並且get()函數透過設定「返回」適當的索引值.sh.value

此範例將陣列版本設為一個值,然後用複合名稱覆寫它們。輸出是

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

如果您想以這種方式綁定多個變量,您應該使用以下方法尋找解決方案您自己的 ksh 類型

答案2

在 中ksh93,複合變數名稱namerefs並不在一起,但它的工作方式相反:

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

相關內容