使用ksh93,typeset -a arr=( () )会将arr[0]创建为一个空的复合变量,而不是一个空的索引数组:
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$那么在声明arr变量时,如何将arr[0]初始化为一个空的索引数组呢?
发布于 2013-03-18 11:19:09
我发现了一种使用较新版本的ksh(用93v- 2013-02-13尝试过)的黑客方法:
$ 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]
$这是合理的,因为索引数组的空子集仍然是索引数组。:)
发布于 2013-03-13 20:17:28
$ ( 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的子元素的属性。请注意,即使我像您一样声明它,使用索引赋值语法将值追加到数组中也会自动将类型恢复为索引类型(因为复合需要声明命令或赋值作为元素)。
$ ( 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。
https://stackoverflow.com/questions/15376514
复制相似问题