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

Bash while循环内selected数组无法清空问题求助

问题原因

你遇到的仓库选择叠加问题,根源在于nums变量未在每次用户重新选择时被清空。nums是select_repos函数的局部变量,当用户选择不继续并重新进入选择流程时,它会保留上一次的数值,新选择的数值会追加进去,导致后续遍历nums时重复向selected数组添加仓库。

修复方案

在每次处理用户输入的代码块开头,也就是selected=()之后,添加nums=()来清空该数组,确保每次选择都从零开始收集数值。

修改后的核心代码片段:

select _ in "${repos_names[@]}" ; do
    selected=()
    nums=()  # 新增这行,清空nums数组
    for item in ${REPLY}; do
        # 原有逻辑保持不变
    done
    # 原有逻辑保持不变
done
完整修复后的脚本
#!/bin/bash

repos=(repo1 repo2 repo3 repo4 repo5 repo6)


update_cmd() {
    echo "Updating..."
}

select_repos() {
    local cmd=$1
    shift
    local repos_names=("${@}")
    local selected=()
    local item
    local nums
    local num

    if [[ -z "${repos_names[@]}" ]]; then
        echo "No repositories found!"
    else
        while true; do
            echo -e "\n\n"
            PS3=$'\nPlease, select the repositories : (eg: "1 2 3", "1-3", repo name, or "A" for ALL)\n==> '
            select _ in "${repos_names[@]}" ; do
                selected=()
                nums=()  # 清空nums数组
                for item in ${REPLY}; do
                    if [[ "${item}" =~ ^(A)+$ ]]; then
                        selected+=( "${repos_names[@]}" )
                        break
                    fi
                    if [[ "${item}" =~ ^([0-9]*)-([0-9]*)+$ ]]; then
                        nums+=( $( seq ${item//[!0-9]/ } ) )
                    fi
                    if [[ "${item}" =~ ^[0-9]+$ ]]; then
                        nums+=( ${item} )
                    fi
                    if [[ "${repos_names[@]}" =~ "${item}" ]]; then
                        selected+=( ${item} )
                    fi
                done
                for num in "${nums[@]}"; do
                    if [ ! -z "${num}" ] && [ 1 -le "${num}" ] && [ "${num}" -le $((${#repos_names[@]})) ]; then
                        selected+=(${repos_names[num - 1]})
                    fi
                done
                [[ ${selected} ]] && break
            done

        
            echo -e "\n"
            echo "--------------------------------------------------------"
            echo "                     SELECTED REPOS                     "
            echo "--------------------------------------------------------"
            printf "%b\n" "${selected[@]}"
            echo "--------------------------------------------------------"
            echo
            echo "Do you want to proceed? [y/N]"
            echo -n "==> "
            read -sn 1

            case "${REPLY}" in
                Y|y)
                    ${cmd} "${selected[@]}"
                    break
                    ;;
                N|n|"")
                    continue
                    ;;
                *) 
                    continue
                    ;;
            esac
        done
    fi
}

select_repos "update_cmd" "${repos[@]}"

内容的提问来源于stack exchange,提问作者KaMZaTa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:12:53