Беспорядок с функциями и ассоциативными массивами в ksh93 - PullRequest
0 голосов
/ 16 августа 2011

Это мой простой массив:

typeset -A foo

foo["first"]="first Value"
foo["second"]="second Value"

И я хочу создать функцию, которая выберет этот массив, что-то сделает и вернет его обратно в скрипт.например,

function changeThat {
    eval tmp=\$$1
    tmp["$2"]=$3
    return $tmp
}

Я мог бы пойти по сценарию и сделать что-то вроде:

foo=changeThat foo "first" "a new first value"

И получить красивый результат, такой как

echo ${foo["first"]}
a new first value

Теперь этоне работает ... Ну, я знаю, что синтаксис, вероятно, не совсем правильный.Но я действительно заблудился, пройдя через нюансы evals и scape echo (не говоря уже о том, что я ненавижу это от всей души).Кроме того, я имею в виду bash , и я бы не впервые пропустил какой-то трюк, когда дело доходит до ksh - например, я был так далеко в ksh88, который даже неесть ассоциативные массивы, в то время как большинство людей говорят, что должно.Оказывается, мой AIX box не согласен.-_-

спасибо!

1 Ответ

2 голосов
/ 14 апреля 2012

Вы можете определить свою функцию следующим образом:

function changeThat {
  typeset -n ref="$1"
  typeset key="$2"
  typeset value="$3"

  ref["$key"]="$value"
}

typeset -n ref определяет переменную ref как ссылку на переменную, указанную в ее значении.

Когда вы делаете этот вызов функции:

changeThat foo this "mow the lawn"

Переменная ref в функции changeThat ссылается на переменную foo. Использование ref теперь похоже на использование foo. После вызова changeThat

    print ${foo["this"]}

теперь будет выводить «косить газон».

...