linux - 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 
testvar=$(testfunc) # segfaults on linux, memfaults on solaris
print ${testvar.one}

注意:我将上面的脚本更新为 print ${testvar.one} from print $testvar 以更准确地显示我想要完成的任务。

我确定之前有人问过这个问题,但我不确定要搜索什么,而且我一直尝试用于关键字的所有内容都没有给我带来与我的问题相关的任何答案。

ksh 版本:

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

solaris:版本 sh(AT&T 研究)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 上使用 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

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

关于linux - ksh:将函数输出分配给数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481310/

相关文章:

java - Jenkins 后台生成过程 - 不会留在队列中的作业

linux - Bash 回显奇怪的行为

mysql - 创建表、查询和表之间的关系

linux - 表格式 Shell 脚本

bash - 如何在具有不同参数的 bash 中重用命令?

linux - bash 参数相等性检查的意外输出

linux - RPM - 安装时间参数

python - 在 Python 中使用 cat 命令进行打印

linux - 使用 sed 打印以两种不同模式开头的行

arrays - 在 Linux Shell 脚本中通过 for 循环访问数组