2

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

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

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

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

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

我读了这个,但这可能不是我的解决方案

4

3 回答 3

2

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

(( ++DRIVE_SIZES[DRIVE_SIZE] ))
于 2013-08-18T17:29:59.710 回答
1

当尚未定义数组键时,您可以使用参数替换将零放入表达式中:

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

注意这是未经测试的,但应该是可能的。

于 2013-08-18T17:28:35.803 回答
1

未设置并用于内部算术表达式的数组元素,(( ))默认$(( ))值为 0,因此这样的表达式可以工作:

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

或者

(( DRIVE_SIZES[DRIVE_SIZE] += 1 ))

或者

(( ++DRIVE_SIZES[DRIVE_SIZE] ))

但是,当在外部使用(( ))or时$(( )),它仍然会扩展为空消息:

echo ${DRIVE_SIZES[RANDOM]}显示""是否RANDOM是未设置元素的索引。

但是,您可以使用$(( ))always 来获得正确的演示文稿:

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

使用-ito declaretypeset或者local在声明数组或简单变量时也可能会有所帮助,因为它只允许这些参数具有整数值,并且分配总是像在(( ))or内部分配一样完成$(( ))

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=()

只要确保你总是在里面使用它(( ))$(( )).

于 2013-08-18T18:48:02.767 回答