Bash初始化稀疏数组

时间:2013-08-18 17:18:31

标签: linux bash shell

我有一个数组,索引是硬盘大小,值是具有相同大小的硬盘数量。所以这就是我的工作。

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

3 个答案:

答案 0 :(得分:2)

在算术表达式中使用增量:

(( ++DRIVE_SIZES[DRIVE_SIZE] ))

答案 1 :(得分:1)

当数组键尚未定义时,您可以使用parameter substitution将零置于表达式中:

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

N.B。这是未经测试的,但应该是可能的。

答案 2 :(得分: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'A设置为2

对于数组,您可以使用-a

将它们设置为整数类型
declare -a -i ARRAYVAR

所以解决方案就是使用一个空数组变量,这就足够了:

ARRAYVAR=()

或者

declare -a -i ARRAYVAR=()

请确保始终在(( ))$(( ))内使用它。