shell 在if中使用时数组不扩展

apeeds0o  于 2023-02-24  发布在  Shell
关注(0)|答案(1)|浏览(90)

我正在创建一个脚本,它将帮助更新GNU/Linux系统中的GoLang编译二进制文件。
但失败了

#!/usr/bin/env bash
# -*- coding: utf-8 -*-
# set -e
# ==============================================================================
# title             : Semi Automatic Update GoLang
# description       : Script for Install, setup path, permission and update golang
# author            : Walddys Emmanuel Dorrejo Céspedes
# usage             : bash up_install.sh
# notes             : Execute this Script will ask sudo password
# dependencies      : wget awk sed curl tar
# ==============================================================================

## Get Golang Versions from repository
declare -a go_jversion go_sversion
readarray -t go_jversion < <(curl -s https://go.googlesource.com/go/+refs?format=JSON | grep -Eo "go[0-9]\.[^\"]+" | sort -V)

## Delete go_versions RC and Beta from the pool.
for i in "${!go_jversion[@]}"; do
    if [[ "${go_jversion[i]}" =~ (rc|beta) ]]; then
        unset "go_jversion[i]"
    fi
done

unset go_sversion # Not allow to grow indefinitely the pool when re-execute the scripts
for i in "${!go_jversion[@]}"; do
    set -vx
    ## Create an array of the stables versions (Those versions that repeat more than or equal to 2 are stables)
    # if [[ "${go_jversion[i]}" == "${go_jversion[i + 1]}" ]] && [[ "${go_sversion[i - 1]}" != "${go_jversion[i + 1]}" ]]; then
    #     go_sversion+=("${go_jversion[i]}")
    # fi

在本节中,我比较主要版本+最小版本,以排除数组的补丁版本,但在“&&"之后的条件,数组"${go_sversion[$i -1]}"在循环的每个循环中扩展null,当我在之前的循环中赋值时。

## Create an array of the stables versions (Those versions that repeat more than or equal to 2 are stables) (second version)
    if [[ "${go_jversion[$i]}" == "${go_jversion[$i + 1]}" && "${go_sversion[$i - 1]}" != "${go_jversion[$i]}" ]]; then
        go_sversion+=("${go_jversion[$i]}")
        echo "${!go_sversion[$i]}"
    fi
    set +vx
done

echo "${go_sversion[@]}"
echo "${!go_sversion[@]}"

我的问题是在"${go_sversion[$i -1]}"部分,为什么不扩展?
"${go_sversion[$i -1]}"赋值为循环下一个周期显示的值

xwbd5t1u

xwbd5t1u1#

bash中的数组可以是稀疏的,这意味着它们的索引不需要严格按顺序排列。例如:

arr=(1 2 3)
echo "${arr[@]}" # prints 1 2 3
echo "${!arr[@]}" # prints 0 1 2
unset arr\[1\]
echo "${arr[@]}" # prints 1 3
echo "${!arr[@]}" # prints 0 2

当你取消设置RC和Beta值时,你可能会在jversion数组中创建这些类型的间隙,但你是按顺序给sversion数组赋值的,这意味着数组之间的索引不对齐。
如果你的jversion看起来像我上面的数组,你可以把jversion[0]中的一些东西放入sversion[0],然后处理jversion[2],并试图将它与尚不存在的sversion[1]进行匹配。
对数组进行反稀疏化的一个简单方法是重新分配数组:

go_jversion=( "${go_jversion[@]}" )

这将按顺序将数组的内容重新分配给数组本身,索引中没有任何间隔。
如果由于某种原因这是不可行的,你必须写代码,意识到数组可能的稀疏性,例如,不是盲目地看go_sversion[i-1],你可以看go_sversion[-1],它总是给予你数组中的最后一项。

相关问题