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 索引數組。
最簡單的答案是設置
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