Ссылка на составную переменную 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() функций 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[@]}" 

Это объявляет составную переменную, а функции дисциплины для подзадач .name и .surname . Функции set() устанавливают соответствующее индексируемое значение person_arr для нового значения (в .sh.value ), а функции get() возвращают соответствующее индексированное значение, устанавливая значение .sh.value .

Пример устанавливает версию массива в одно значение, а затем перезаписывает их составными именами. Выход

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

Если у вас есть несколько переменных, которые вы хотите связать таким образом, вы должны искать решение, используя свой собственный тип ksh .

В ksh93 составные имена переменных и namerefs не namerefs , но они работают наоборот:

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