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

相关内容