Shell脚本移除数组中间元素结果不符,求修改方案
移除数组中间元素的Bash代码修复方案
问题描述
现有一段Bash代码意图移除数组的中间元素,但运行结果不符合预期:
- 输入数组大小3,元素
1、2、3 - 实际输出:
1 2 - 预期输出:
1 3
原代码
#!/bin/bash shift_array_to_left () { local n=$1 local idx=$2 for ((i=idx; i < n-1; i++)); do arr[$i]=${arr[i + 1]} done arr[n - 1]=0 echo $((n - 1)) } return_mid_index () { local n=$1 if [ $n -le 0 ]; then echo $n elif [ $((n&1)) -eq 1 ]; then echo $((n - (n-1)/2 - 1)) else echo $((n/2 - 1)) fi } main() { local n=0 read -p "Enter size of array: " n echo "Enter your array" declare -a arr for ((i=0; i < n; i++)); do read arr[$i] done idx=$(return_mid_index $n) n=$(shift_array_to_left $n $idx) for ((i=0; i < n; i++)); do echo -n "${arr[i]} " done return 0 } main
问题分析
- 数组作用域错误:
main函数中使用declare -a arr定义的是局部数组,而shift_array_to_left函数直接访问的是全局arr变量,导致函数对数组的修改无法作用到main中的局部数组,最终输出的还是原数组的前n-1个元素。 - 索引计算冗余:
return_mid_index函数中奇数长度数组的中间索引计算逻辑冗余,$((n - (n-1)/2 - 1))等价于更直观的$((n/2)),可简化。
修改建议
- 将
main函数中的局部数组改为全局数组:把declare -a arr替换为declare -g arr,确保shift_array_to_left能正确修改目标数组。 - 简化
return_mid_index的奇数分支计算逻辑,提升代码可读性。
修改后的代码
#!/bin/bash shift_array_to_left () { local n=$1 local idx=$2 for ((i=idx; i < n-1; i++)); do arr[$i]=${arr[i + 1]} done arr[n - 1]=0 echo $((n - 1)) } return_mid_index () { local n=$1 if [ $n -le 0 ]; then echo $n elif [ $((n&1)) -eq 1 ]; then echo $((n/2)) # 简化奇数索引计算 else echo $((n/2 - 1)) fi } main() { local n=0 read -p "Enter size of array: " n echo "Enter your array" declare -g arr # 声明为全局数组 for ((i=0; i < n; i++)); do read arr[$i] done idx=$(return_mid_index $n) n=$(shift_array_to_left $n $idx) for ((i=0; i < n; i++)); do echo -n "${arr[i]} " done echo # 补充换行,优化输出格式 return 0 } main
验证结果
输入数组大小3,元素1、2、3,输出为1 3,符合预期。
内容的提问来源于stack exchange,提问作者Krishanu dev
相关产品推荐
相关产品推荐

