我想使用稱為複合變數的 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