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
相关产品推荐
相关产品推荐

