使用ksh93,typeset -a arr=( () )
将创建arr[0]
作为空复合变量而不是空索引数组:
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$
那么在声明arr[0]
var时,如何将arr
初始化为空的索引数组?
答案 0 :(得分:1)
$ ( typeset -a a[0]=(); typeset -p a 'a[0]' )
typeset -a a=( () )
typeset -a a[0]
我认为没有人确切知道。我问是否有人可以在your thread中解释ksh看似随机的声明背后的一些逻辑,但从未得到答复。
我相信对这个特定问题的解释是,将多维索引数组视为“可嵌套”是错误的,即使语法强烈建议它。整个数组都是一种类型,因此一旦声明了数组,就不能单独将“空集合”设置为第0个元素。唯一真正的可嵌套类型是复合,因此通过尝试在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。
答案 1 :(得分:0)
我发现了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]
$
这是合理的,因为索引数组的空子集仍然是索引数组。 :)