为什么这不起作用?
#!/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
,以更准确地显示我要完成的任务。
我确信之前已经问过这个问题,但我不确定要搜索什么,而且我一直尝试用于关键字的所有内容都没有给我带来任何与我的问题相关的答案。
ksh版本:
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}
我认为这就是你定义关联数组的方式,也许我所看到的是旧的,但是谁知道....这似乎是奇怪的行为,因为这打印出“motherload”和“vain”
答案 0 :(得分:2)
在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使用括号内的数组下标。虚线表示法用于访问compound variable的成员。
我不相信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
您可能需要查阅有关学科功能和类型变量的文档