我有一个数组,索引是硬盘大小,值是具有相同大小的硬盘数量。所以这就是我的工作。
DRIVE_SIZES[$DRIVE_SIZE]=`expr ${DRIVE_SIZES[$DRIVE_SIZE]} + 1`
我没有将DRIVE_SIZES数组初始化为0.因此上面的行可能无效。 我想在bash脚本中初始化一个稀疏数组。
假设主机中的所有驱动器大小相同,除了一个。大约10个驱动器的大小为468851544,一个驱动器的大小为268851544.所以我无法初始化0-468851544的所有索引,因为我事先不知道最大磁盘大小。
有没有办法将这样的稀疏数组初始化为0.可能是有办法在bash中声明一个可能有帮助的整数数组。但经过一些初步的研究发现我可以声明一个整数,但不是整数数组(可能是错误的)。有人可以帮我这个吗?
答案 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
或现有元素的值,但不返回空字符串。
在声明数组或简单变量时,使用-i
到declare
,typeset
或local
也可能有所帮助,因为它只允许这些参数具有整数值,并且分配总是像在(( ))
或$(( ))
内分配一样。
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=()
请确保始终在(( ))
或$(( ))
内使用它。