2011-07-27 16 views
1

kshで一種のプロパティセットを構築しようとしています。kshでの配列の優雅な使用

私が考えている最も簡単な方法は、配列を使用していましたが、構文が私を殺しています。

は、私が欲しいのは

  1. に名前とプロパティを使用して設定ファイル内の任意のサイズの配列を構築しています。
  2. リスト内の各項目を繰り返し、そのプロパティを取得します。私は私が行うことがしたい何

私の理論は後に、何か行うことができその後

MONITORINGSYS={ 
    SYS1={NAME="GENERATOR" MONITORFUNC="getGeneratorStatus"} 
    SYS2={NAME="COOLER" MONITORFUNC="getCoolerStatus"} 
} 

のようなものです:まあ、それは本当のプログラミングではありません

for CURSYS in $MONITORINGSYS 
do 
    CSYSNAME=$CURSYS.NAME 
    CSYSFUNC=$CURSYS.MONITORFUNC 

    REPORT="$REPORT\n$CSYSNAME" 

    CSYSSTATUS=CSYSFUNC $(date) 
    REPORT="$REPORT\t$CSYSSTATUS" 
done 
echo $REPORT 

を、しかし、私はあなたがポイントを持っていると思います..

どうすればいいですか?

[EDIT]

私は連想配列を使用したいというわけではありません。私は私の質問をより明確にするためにこの方法をとっているだけです。

for CURSYS in $MONITORINGSYS 
do 
    CSYSNAME=${CURSYS[0]} 
    CSYSFUNC=${CURSYS[1]} 

    REPORT="$REPORT\n$CSYSNAME" 

    CSYSSTATUS=CSYSFUNC $(date) 
    REPORT="$REPORT\t$CSYSSTATUS" 
done 
echo $REPORT 

同じ、私はちょうどそれが最小限に読みやすくなります構文を探しています...設定ファイルに適用されます。ループのようなものだったかどうかは問題ではないでしょう。

歓声

+0

ありません。 ksh配列は整数ベースのみです。少なくともksh実装にはアクセスできます。解析できる賢明な文字列で何かをハックすることができると確信していますが、連想配列が必要な場合は、連想配列で言語を選択してください。 –

+2

これは間違いなくksh88m以降のバージョンで可能です。申し訳ありませんが、今すぐあなたに例を挙げる時間がありません。 kornshell.comを見て、UWIN版を入手してください。 'set -A myArr'はあなたを起動させます。私はあなたが記述するよりも複雑な、何メガバイトの変数を持つ人々のUWINメーリングリストに関するレポートを見ました。がんばろう。 – shellter

+0

ありがとうございますが、配列は結合的である必要はありません。私はそれを明確にするためにその方法を説明したにすぎません。私はアクセスしても '' CSYSNAME = CURSYS [0] ''と '' CSYSFUNC = CURSYS [1] ''と言うことはできません。 – filippo

答えて

3

あなたが望むものを正確にわからない... Kornシェルは、連想とインデックス配列の両方を扱うことができます。

ただし、Kornshell配列は1次元です。 $()とevalを使用して、インダイレクションを使用して2次元配列をエミュレートすることができます。私は古いPerl 4.xとPerl 3.xでこれを数回しましたが、それは痛みです。多次元配列が必要な場合は、PythonまたはPerlを使用します。

唯一のことは、あなたがtypedefコマンド経由で配列を宣言しなければならないということです。

$ typeset -A foohash #foohash is an associative array 
$ typeset -a foolist #foolist is an integer indexed array. 

たぶん、あなたのスクリプトは、この

typeset -a sysname 
typeset -a sysfunct 

sysname[1] = "GENERATOR" 
sysname[2] = "COOLER" 
sysfunc[1] = "getGeneratorStatus" 
sysfunc[2] = "getCoolerStatus" 

for CURSYS in {1..2} 
do 
    CSYSNAME="${sysname[$CURSYS]}" 
    CSYSFUNC="${sysfunc[$CURSYS]}" 
    REPORT="$REPORT\n$CSYSNAME" 
    CSYSSTATUS=$(eval "CSYSFUNC $(date)") 
    REPORT="$REPORT\t$CSYSSTATUS" 
done 
echo $REPORT 
+0

非常に興味深い。私は連想配列に対して '' -A''を認識していませんでしたが、私が必要とするものかもしれません。インデックス名を取得する方法はありますか?たとえば、 '' typeset -A foo; foo ["COOLER"] = "getCoolerStatus" ''そして、どういうわけか後に、 '' "COOLER" ''という言葉を '' foo''から得ることもできましたか?ありがとう! – filippo

+0

meh ...明らかに私のkshは '' -A''をサポートしていません。バージョンは '' Version M-11/16/88f''(AIXボックス)です。 – filippo

+0

バージョン88は、AT&TのDavid Kornオリジナルの本で言及されているので、連想配列をサポートする必要があります。 (私は署名付きのコピーを持っています!)。私は自分のシステムを見て、私は93歳なので、私はそれをテストすることはできません。 "typeset -h"と入力して、それが何を出力するかを見てください。 Ksh 93は、tkタイプのグラフィックスレイヤーと、浮動小数点および複合変数を処理する機能を追加します。それはKornshellを完全なプログラミング言語にしようとしたものの、決して本当に始まったことはありません。 –

1

は、ksh93のようなものは今混合物を含有することができる化合物の変数を持って見ることができます索引付きおよび連想配列のkshがそれ自体を動作させるので、宣言する必要はありません。

#!/bin/ksh 

MONITORINGSYS=(
     [SYS1]=(NAME="GENERATOR" MONITORFUNC="getGeneratorStatus") 
     [SYS2]=(NAME="COOLER" MONITORFUNC="getCoolerStatus") 
) 

echo MONITORING REPORT 
echo "-----------------" 

for sys in ${!MONITORINGSYS[*]}; do 
     echo "System: $sys" 
     echo "Name:  ${MONITORINGSYS[$sys].NAME}" 
     echo "Generator: ${MONITORINGSYS[$sys].MONITORFUNC}" 
     echo 
done 

出力:kshの中

MONITORING REPORT 
----------------- 
System: SYS1 
Name:  GENERATOR 
Generator: getGeneratorStatus 

System: SYS2 
Name:  COOLER 
Generator: getCoolerStatus 
+0

この課題は何が問題になっていますか? 植字-C xxxの xxx.NAME = GENERATOR xxx.MONITORFUNC = getFooBar おかげでこれを試してみてください – mehturt

+1

。これは、空の名前と発電機をプリントアウト-A MONITORINGSYS MONITORINGSYS [SYS1] = $ xxxの (またはXXX) をタイプセット: 'typeset -C MONITORINGSYS [SYS1] = xxx'、' typeset -A MONITORINGSYS'を使用して_without_です。 – dannyw

+0

はい、私はそれも実現しましたが、この例はどこにも見つかりませんでした。再度、感謝します – mehturt

関連する問題