我想使用称为复合变量的 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