Я хотел бы использовать функцию 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