ksh: назначение вывода функции массиву

Почему это не работает???

#!/bin/ksh

# array testfunc()
function testfunc {
    typeset -A env
    env=( one="motherload" )
            print -r $env
    return 0
}

testfunc # returns: ( one=motherload )
typeset -A testvar # segfaults on linux, memfaults on solaris 
testvar=$(testfunc) # segfaults on linux, memfaults on solaris
print ${testvar.one}

примечание: я обновил приведенный выше сценарий до print ${testvar.one} с print $testvar, чтобы более точно показать, чего я пытаюсь достичь.

Я уверен, что об этом спрашивали раньше, но я не уверен, что искать, и все, что я пытался использовать для ключевых слов, не дает мне никаких ответов, связанных с моей проблемой.

кш версия:

linux: version sh (AT&T Research) 1993-12-28 s+

solaris: version sh (AT&T Research) 93s+ 2008-01-31

Обновлять:

Итак, другой вопрос: это будет работать в ksh 93t+ без ошибки, но неправильно назначает массив. Я бы пошел о назначении массива из функции? Я также попытался назначить массив следующим образом:

typeset -A testvar=$(testfunc)
print ${testvar.one}

Но это тоже не работало должным образом.

РЕДАКТИРОВАТЬ

Так что же здесь происходит?

typeset -A env=( one="motherload" two="vain" )
print ${env.one}
print ${env.two}

Я думал, что именно так вы определили ассоциативные массивы, может быть, то, на что я смотрел, было старым, но кто знает .... кажется странным поведением, поскольку это печатает «материнская нагрузка» и «напрасно»


person rcarson    schedule 20.03.2010    source источник
comment
Это называется составной переменной. Это похоже на структуру. Я поясню одно из предложений в своем ответе. informit.com/articles/article.aspx?p=99035&seqNum=5< /а>   -  person Dennis Williamson    schedule 23.03.2010


Ответы (1)


Ваш скрипт отлично работает для меня в Linux с ksh 93t+.

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

hd filename
cat -v filename
hexdump -C filename

Если это просто вопрос окончания строки DOS, то это исправит:

dos2unix filename

Изменить:

Вот один из способов создания и заполнения ассоциативного массива в ksh:

$ typeset -A testvar
$ testvar=([one]="motherlode" [two]="vein" [waste]="tailings")
$ echo ${testvar[two]}
vein
$ testvar[ore]="gold"
$ echo ${!testvar[@]}    # print the indices of the array
one two waste ore
$ typeset -p testvar     # show the current definition of the array
typeset -A testvar=([one]="motherlode" [two]="vein" [waste]="tailings" [ore]="gold")

Как видите, ksh использует индексы в квадратных скобках для массивов. Точечное обозначение используется для доступа к членам составной переменной.

Я не верю, что функции ksh могут возвращать массивы. Однако вы можете использовать метод печати, который есть у вас в вашей функции (но добавить квадратные скобки вокруг имени индекса) и использовать eval для выполнения присваивания.

$ typeset -A testvar 
$ eval "testvar=($(testfunc))"

или добавить к существующему массиву:

$ eval "testvar+=($(testfunc))"

Если ваша функция не использует ассоциативные массивы внутри, вам не обязательно использовать их для построения вывода.

Однако, если вы это сделаете, вы можете проанализировать результат typeset -p:

$ result=$(typeset -p env)
$ result=${result#*\(}
$ result=${result%\)*}
$ print result

или перебрать массив:

$ for index in ${!env[@]}; do print -n "[$index]=${env[$index]} "; done; print

Вы можете обратиться к документации, касающейся дисциплинарных функций и переменных типов.

person Dennis Williamson    schedule 20.03.2010
comment
Итак, у меня это работает и на ksh 93t+... похоже, это было проблемой в предыдущих версиях ‹93s+... - person rcarson; 22.03.2010
comment
на самом деле это просто не ошибка, это не дает результатов, которые я искал. - person rcarson; 22.03.2010