Linux ksh:将函数输出分配给数组
为什么这不管用Linux ksh:将函数输出分配给数组,linux,shell,scripting,solaris,ksh,Linux,Shell,Scripting,Solaris,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
#!/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:sh版(AT&T研究)1993-12-28 s+
solaris:sh版(美国电话电报公司研究)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”您的脚本在使用ksh 93t+的Linux上运行良好 因为它是同一个脚本,并且在两个不同的环境中会出现类似的错误,所以我怀疑文件中会出现错误字符。尝试其中一种方法以显示可能存在的任何游离字符:
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
您可能需要查阅有关规程函数和类型变量的文档好的,因此它也适用于我的ksh 93t+。。。看起来这是以前的一个问题,实际上它没有错误,它没有提供我想要的结果,这叫做复合变量。它类似于一个结构。我将澄清我答案中的一句话。