Bash数组索引切片报错原因及正确实现方法
Bash数组索引切片:报错原因与解决方法
问题中的报错原因
${!array[@]}是Bash中获取数组所有索引的参数扩展语法,但Bash不支持直接对索引扩展的结果执行切片操作。当你尝试写${!array[@]:0:2}时,Shell会错误地将!array[@]:0:2整体解析为一个变量名,而包含特殊字符的这个“变量名”显然是无效的,因此抛出invalid variable name错误。
实现索引切片的正确方法
想要对数组索引做切片,需要先把所有索引存入一个临时数组,再对这个临时数组执行切片操作:
array=('a' 'b' 'c' 'd') # 将数组索引存入临时数组 indices=("${!array[@]}") # 对临时数组做切片,取前2个索引 echo "${indices[@]:0:2}" # 输出:0 1
目标场景的实现(遍历除最后一个索引外的所有索引)
针对你需要遍历数组除最后一个索引外的所有索引的场景,同样需要借助临时数组来实现:
array=('a' 'b' 'c' 'd') indices=("${!array[@]}") # 计算需要保留的索引数量:总索引数减1 slice_length=$(( ${#indices[@]} - 1 )) # 遍历切片后的索引 for idx in "${indices[@]:0:$slice_length}"; do echo "当前索引:$idx,对应元素:${array[$idx]}" done
执行后输出:
当前索引:0,对应元素:a 当前索引:1,对应元素:b 当前索引:2,对应元素:c
内容的提问来源于stack exchange,提问作者Feasuro
相关产品推荐
相关产品推荐

