首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ksh93,如何安全地将二维索引数组初始化到( () )

使用ksh93,如何安全地将二维索引数组初始化到( () )
EN

Stack Overflow用户
提问于 2013-03-13 11:24:57
回答 2查看 225关注 0票数 1

使用ksh93,typeset -a arr=( () )会将arr[0]创建为一个空的复合变量,而不是一个空的索引数组:

代码语言:javascript
复制
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$

那么在声明arr变量时,如何将arr[0]初始化为一个空的索引数组呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-18 11:19:09

我发现了一种使用较新版本的ksh(用93v- 2013-02-13尝试过)的黑客方法:

代码语言:javascript
复制
$ echo ${.sh.version}
Version AJMP 93v- 2013-02-13
$ typeset -p arr
$ typeset -a arr=( ( ${not_existing_array[@]:0:0} ) )
$ typeset -p arr
typeset -a arr=( () )
$ typeset -p arr[0]
typeset -a arr[0]
$

这是合理的,因为索引数组的空子集仍然是索引数组。:)

票数 0
EN

Stack Overflow用户

发布于 2013-03-13 20:17:28

代码语言:javascript
复制
$ ( typeset -a a[0]=(); typeset -p a 'a[0]' )
typeset -a a=( () )
typeset -a a[0]

我想没有人能确切地知道。我问是否有人可以解释一下ksh在your thread中看似随意的声明背后的一些逻辑,但从未得到回复。

我认为对这个特定问题的解释是,将多维索引数组视为“嵌套”是错误的,尽管语法强烈建议这样做。整个数组都是一种类型,所以一旦声明了数组,就不能将“空集合”单独设置为第零个元素。唯一真正可嵌套的类型是复合类型,因此,如果试图在a[0]中创建一个向量,而不至少为a[0][0]分配一个空字符串,那么它就假定它一定是复合类型。

换句话说,typeset -a a同时设置了a和所有子元素的类型,所以您可以继续往高维添加值,因为它们不可能有单独的属性,而不是复合的。

我认为上面的语法只是一个漏洞,它允许设置隐式应用于a的子元素的属性。请注意,即使我像您一样声明它,使用索引赋值语法将值追加到数组中也会自动将类型恢复为索引类型(因为复合需要声明命令或赋值作为元素)。

代码语言:javascript
复制
 $ ( typeset -a a=( () ); typeset -p a 'a[0]'; a[0]+=(x y z); typeset -p a 'a[0]' )
typeset -a a=(())
typeset -C a[0]=()
typeset -a a=(([1]=x [2]=y [3]=z) )
typeset -a a[0]=([1]=x [2]=y [3]=z)

当然,还有很多事情我不明白。LMK如果你发现什么特别有趣的东西。:)我想我们大概是唯一使用这些特性的人...几乎不可能找到示例代码。

另外,我已经开始记录一些ksh/bash/zsh风格的数组比较here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15376514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档