2013-08-18 36 views
2

我有一个数组,索引是硬盘驱动器的大小,值是具有相同大小的硬盘驱动器的数量。所以这就是我所做的。Bash初始化稀疏阵列

DRIVE_SIZES[$DRIVE_SIZE]=`expr ${DRIVE_SIZES[$DRIVE_SIZE]} + 1` 

我还没有将DRIVE_SIZES数组初始化为0.所以上面的行可能不起作用。 我想在bash脚本中初始化一个稀疏数组。

可以说主机中的所有驱动器的大小相同,除了一个。大约10个驱动器的大小为468851544,一个驱动器的大小为268851544.因此,我不能初始化0-468851544的所有索引,因为我事先不知道最大磁盘大小。

那么有没有办法将这样一个稀疏数组初始化为0.可能是如果有办法在bash中声明一个整数数组可能会有所帮助。但经过一些最初的研究发现,我可以声明一个整数,但不是整数数组(可能是错误的)。有人可以帮我弄这个吗 ?

I read this, but this might not be the solution to me

回答

2

使用增量:

((++DRIVE_SIZES[DRIVE_SIZE])) 
+0

谢谢你的帮助。 – nachiappan

1

您可以使用parameter substitution把一个零到表达当数组键还没有被定义尚未:

DRIVE_SIZES[$DRIVE_SIZE]=`expr ${DRIVE_SIZES[$DRIVE_SIZE]:-0} + 1` 

注:这是未经测试的,但应该是可能的。在一个算术表达式

1

在算术表达式中使用内部(())$(())数组元素未设置时和具有为0的默认值,从而这样的表达式将工作:

((DRIVE_SIZES[DRIVE_SIZE] = DRIVE_SIZES[DRIVE_SIZE] + 1)) 

或者

((DRIVE_SIZES[DRIVE_SIZE] += 1)) 

或者

((++DRIVE_SIZES[DRIVE_SIZE])) 

然而外(())$(())当使用时,它仍然会扩展到空消息:

echo ${DRIVE_SIZES[RANDOM]}显示""如果RANDOM原来是被复位的一个元素的索引。

但是,您可以使用$(())始终得到适当的介绍:

echo "$((DRIVE_SIZES[RANDOM]))"将返回要么0或现有元素的值,而不是空字符串。

使用-ideclaretypesetlocal声明时,阵列或简单的变量也可以帮助,因为这将只允许这些参数有整数值,并且如果它被内部(())$(())分配的分配总是完成。

declare -i VAR 
A='1 + 2' 

相同((A = 1 + 2))

而且随着((B = 1))A='B + 1'设置A2

对于数组,你可以将它们设置为整型与-a

declare -a -i ARRAYVAR 

因此,一个解决方法就是使用一个空数组变量,这将是足够的:

ARRAYVAR=() 

或者

declare -a -i ARRAYVAR=() 

只要确保你总是在(())内使用它或$(())