使用 ksh93,typeset -a arr=( () )
将创建arr[0]
为空的复合 var 而不是空的索引数组:
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$
那么在声明var时如何初始化arr[0]
一个空的索引数组呢?arr
使用 ksh93,typeset -a arr=( () )
将创建arr[0]
为空的复合 var 而不是空的索引数组:
$ typeset -a arr=( () )
$ typeset -p arr[0]
typeset -C arr[0]=()
$
那么在声明var时如何初始化arr[0]
一个空的索引数组呢?arr
$ ( typeset -a a[0]=(); typeset -p a 'a[0]' )
typeset -a a=( () )
typeset -a a[0]
我想没有人肯定知道。我问是否有人可以在您的线程中解释 ksh 看似随机声明背后的一些逻辑,但从未得到答复。
我相信对这个特定问题的解释是,将多维索引数组视为“可嵌套的”是错误的,尽管语法强烈建议这样做。整个数组都是一种类型,因此一旦声明了数组,就不能单独将“空集合”设置为第零个元素。唯一真正的可嵌套类型是复合类型,因此通过尝试在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 样式的数组比较。
93v- 2013-02-13
我发现了一种使用ksh的较新版本(尝试过)的黑客方法:
$ 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]
$
这是合理的,因为索引数组的空子集仍然是索引数组。:)