Ksh

Ksh 複合變數引用

  • October 2, 2016

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

另一方面,我有趣的值保存在數字組織的數組中。我想像這樣將復合變數綁定到數組代表

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

但結果我得到了

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

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

最簡單的答案是設置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值設置為新值(in .sh.value),get()函式通過設置“返回”適當的索引值.sh.value

該範例將數組版本設置為一個值,然後用複合名稱覆蓋它們。輸出是

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

如果您有多個變數要以這種方式綁定,您應該尋找使用您自己的 ksh 類型的解決方案。

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

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

引用自:https://unix.stackexchange.com/questions/312345