Элегантное использование массивов в ksh - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь создать своего рода набор свойств в 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

То же самое относится к файлу конфигурации .. Я просто смотрюдля синтаксиса, который делает его минимально читаемым.

cheers

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Не совсем уверен, что вы хотите ... 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
1 голос
/ 24 июня 2016

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
...