用了Bash这么久,才知道Bash支持Array。但是却缺乏对嵌套数组,或者是多维数组的支持。自己的实验里面需要用到结构性的数据,这样看起来或者改起来会比较方便,而且因为这部分是用来处理实验结果,需要经常修改,所以不适合放到C++里面去写。
因此就有了需要Bash支持嵌套数组的需求。
最终的解决方法不是很漂亮,但是也足够我自己用了。这个想法的出发点是这样的:
Bash在处理数组的时候会用到IFS这个环境变量。比如这样一段字符
Li,Age*1;Weight*2;Height*3;Friends*Sun^Wang Wang,Age*11;Weight*12;Height*13;Friends*Li^Sun
如果IFS是空格,我们就可以得到两个元素
- Li,Age*1;Weight*2;Height*3;Friends*Sun^Wang
- Wang,Age*11;Weight*12;Height*13;Friends*Li^Sun
如果IFS是分号(;),我们可以得到另一个数组
- Li,Age*1
- Weight*2
- Height*3
- Friends*Sun^Wang Wang,Age*11
- Weight*12
- Height*13
- Friends*Li^Sun
也就是说我们可以通过指定不同的IFS让一段字符成为不同的数组。
所以,我们可以通过对每一层使用不同的IFS来表达一个嵌套数组。比如上面那段字符,我们用不同的IFS字符,先用空格( ),再用逗号(,),之后用分号(;)……
如此做下去就可以达到层层盘剥的效果(-_-!)
在实际使用中,我们只要保证每一层用到的IFS不会在数组内容中出现就行了。
为了能够生成那样一段字符,我们自然需要一些函数做辅助。
具体的代码放到Github上了。目前这个方法虽然有效,但是使用起来仍然不够简洁,看起来如果找不到更好的Bash下的解决方法,就得考虑换用一种20世纪的脚本语言了…
Github: Nested-Array-Bash