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인덱싱된 값을 새 값(in .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

관련 정보