【问题标题】:ksh: assigning function output to an arrayksh:将函数输出分配给数组
【发布时间】:2011-01-29 16:38:09
【问题描述】:

为什么这不起作用???

#!/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

更新:

所以另一个问题是,这将在 ksh 93t+ 中运行而不会出现错误,但是它没有正确分配数组。我会从一个函数中分配一个数组吗?我也尝试像这样分配数组:

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

但这也不能正常工作。

编辑

那么这里发生了什么?

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

我以为这就是你定义关联数组的方式,也许我看到的是旧的但谁知道.... 似乎奇怪的行为,因为这会打印出“motherload”和“vain”

【问题讨论】:

标签: linux shell scripting solaris ksh


【解决方案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 对数组使用带括号的下标。点分符号用于访问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

您可能需要查阅有关学科函数和类型变量的文档

【讨论】:

  • 好的,所以它在 ksh 93t+ 上也适用于我...看起来这是以前
  • 实际上它只是没有错误,它没有提供我正在寻找的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多