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

时间:2013-03-13 03:24:57

标签: ksh

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

$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$

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

2 个答案:

答案 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]
$

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