2010-03-20 90 views
2

为什么没有这项工作???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更新以上脚本print ${testvar.one}更精确地显示出什么,我试图完成。

我相信这已经问过,但我不知道该怎么搜索的,我一直在试图用关键字都没有把我与我的问题的任何答案。

KSH版本:

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

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

更新:

所以另外一个问题是,这将在KSH93吨+运行,而不给了一个错误,但是,它不分配阵列正确。我会去分配一个函数的数组吗?我试图像这样分配阵列:

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

但这也没有正常工作。

编辑

所以这里发生了什么?

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

我认为这是你如何定义关联数组,也许我一直在寻找的是旧的,但谁知道....似乎很奇怪的行为,因为这打印出“motherload”和“虚荣”

+0

什么是你的KSH版本? – ghostdog74 2010-03-20 00:34:43

+0

请参阅我编辑的答案。 – 2010-03-22 20:46:58

+0

这就是所谓的复合变量。它与结构相似。我会在我的答案中澄清其中一个句子。 http://www.informit.com/articles/article.aspx?p=99035&seqNum=5 – 2010-03-22 22:30:25

回答

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 

你可能想咨询有关纪律功能的文件和类型变量

+0

好了,所以我的作品也KSH93吨+ ...看起来这是在以前的<93S问题+版本... – rcarson 2010-03-22 07:41:35

+0

实际上它没有错误,它不提供我正在寻找的结果。 – rcarson 2010-03-22 19:10:08

+0

那我到底在做什么呢? < see edit > – rcarson 2010-03-22 21:49:46