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

Wal*_*des 1 arrays bash shell scripting

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

\n

但它失败了

\n
#!/usr/bin/env bash\n# -*- coding: utf-8 -*-\n# set -e\n# ==============================================================================\n# title             : Semi Automatic Update GoLang\n# description       : Script for Install, setup path, permission and update golang\n# author            : Walddys Emmanuel Dorrejo C\xc3\xa9spedes\n# usage             : bash up_install.sh\n# notes             : Execute this Script will ask sudo password\n# dependencies      : wget awk sed curl tar\n# ==============================================================================\n\n## Get Golang Versions from repository\ndeclare -a go_jversion go_sversion\nreadarray -t go_jversion < <(curl -s https://go.googlesource.com/go/+refs?format=JSON | grep -Eo "go[0-9]\\.[^\\"]+" | sort -V)\n\n## Delete go_versions RC and Beta from the pool.\nfor i in "${!go_jversion[@]}"; do\n    if [[ "${go_jversion[i]}" =~ (rc|beta) ]]; then\n        unset "go_jversion[i]"\n    fi\ndone\n\nunset go_sversion # Not allow to grow indefinitely the pool when re-execute the scripts\nfor i in "${!go_jversion[@]}"; do\n    set -vx\n    ## Create an array of the stables versions (Those versions that repeat more than or equal to 2 are stables)\n    # if [[ "${go_jversion[i]}" == "${go_jversion[i + 1]}" ]] && [[ "${go_sversion[i - 1]}" != "${go_jversion[i + 1]}" ]]; then\n    #     go_sversion+=("${go_jversion[i]}")\n    # fi\n
Run Code Online (Sandbox Code Playgroud)\n

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

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

我的问题是在部分"${go_sversion[$i -1]}",为什么不扩展?

\n

"${go_sversion[$i -1]}"给下一个循环循环中显示的值赋值

\n

tjm*_*772 5

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
Run Code Online (Sandbox Code Playgroud)

当您取消设置 RC 和 Beta 值时,您可能会在jversion数组中创建这些类型的间隙,但您是按sversion顺序分配给数组的。这意味着数组之间的索引不对齐。

如果您的jversion数组看起来像上面的数组,您可以将一些内容放入sversion[0]from中jversion[0],然后处理并尝试将其与尚不存在的数组jversion[2]进行匹配。sversion[1]

去稀疏数组的一种简单方法是重新分配它:

go_jversion=( "${go_jversion[@]}" )
Run Code Online (Sandbox Code Playgroud)

这将按顺序将数组的内容重新分配给自身,索引中不会有任何间隙。

如果由于某种原因这是不可行的,您必须编写能够意识到数组可能稀疏的代码。例如,go_sversion[i-1]您不必盲目地查看,而是查看go_sversion[-1]它始终会为您提供数组中的最后一项。