Bash中‘array=X’是否始终赋值给数组首个元素?需示例解惑
Bash中
array=X是否始终赋值给索引数组第一个元素? 好问题!其实并不是——array=X的赋值下标完全取决于这个数组之前的赋值历史,咱们结合Bash手册的说明和实际例子来搞明白:
当为索引数组赋值时,若提供了可选的方括号和下标,则赋值给该下标对应的元素;否则,被赋值元素的下标为该语句上次赋值的最后一个下标加1。
情况1:数组是全新的(从未赋值或被清空)
这时候“上次赋值的最后下标”默认是-1,加1后就是0,所以array=X会赋值给第一个元素(下标0):
# 确保数组未定义 unset my_array my_array=hello echo ${my_array[0]} # 输出:hello echo ${!my_array[@]} # 输出:0(显示数组所有下标)
情况2:数组之前已有指定下标的赋值
如果之前给数组的某个非0下标赋值过,再用array=X时,新下标会是最后一次赋值的下标+1:
# 先给下标3赋值 my_array[3]=world # 不带下标赋值 my_array=foo echo ${my_array[4]} # 输出:foo echo ${!my_array[@]} # 输出:3 4 echo ${my_array[@]} # 输出:world foo
情况3:数组之前是批量赋值的
如果之前用array=(元素1 元素2 ...)这种方式批量初始化,最后下标是数组长度-1,后续array=X会用这个最后下标+1作为新下标:
unset my_array my_array=(apple banana cherry) # 下标0、1、2,最后下标是2 my_array=date echo ${my_array[3]} # 输出:date echo ${my_array[@]} # 输出:apple banana cherry date
特殊情况:重置数组后
如果用array=()清空数组,会重置“最后下标”的计数,这时候再用array=X又会回到下标0:
my_array[5]=test my_array=() # 清空数组,重置下标计数 my_array=hello echo ${my_array[0]} # 输出:hello
总结一下:array=X的目标下标不是固定的0,而是由数组最近一次赋值的最后下标+1决定——只有当数组是首次赋值或刚被重置时,才会赋值给下标0。
内容的提问来源于stack exchange,提问作者illiterate
相关产品推荐
相关产品推荐

