코드에서 무슨 일이 일어나고 있는지 더 잘 보여주기 위해 복합 변수라는 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