Ссылка на составную переменную 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

Связанный контент