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を宣言します.surnameset()関数は、適切なperson_arrインデックス値を新しい値 ( 内.sh.value) に設定し、get()関数は を設定することで適切なインデックス値を「返します」.sh.value

この例では、配列バージョンを1つの値に設定し、それを複合名で上書きします。出力は次のようになります。

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

関連情報