You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 数组作用域错误:main函数中使用declare -a arr定义的是局部数组,而shift_array_to_left函数直接访问的是全局arr变量,导致函数对数组的修改无法作用到main中的局部数组,最终输出的还是原数组的前n-1个元素。
  2. 索引计算冗余:return_mid_index函数中奇数长度数组的中间索引计算逻辑冗余,$((n - (n-1)/2 - 1))等价于更直观的$((n/2)),可简化。

修改建议

  1. 将main函数中的局部数组改为全局数组:把declare -a arr替换为declare -g arr,确保shift_array_to_left能正确修改目标数组。
  2. 简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:54:54