繁体   English   中英

在ksh中优雅使用数组

[英]Elegant use of arrays in 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

嗯,这不是真正的编程,但我想你明白了......

我怎么做?

[编辑]

我不是说我想使用关联数组。 我只是用这种方式让我的问题更清楚......即如果循环是这样的话就不会有问题:

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

这同样适用于配置文件..我只是在寻找一种使其具有最低可读性的语法。

干杯

不完全确定你想要什么... Kornshell可以处理关联和索引数组。

但是,Kornshell数组是一维的。 也许可以使用间接通过使用$()和eval来模拟二维数组。 我在较旧的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

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

输出:

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

System:    SYS2
Name:      COOLER
Generator: getCoolerStatus

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM