Массив не расширяется при использовании в if

Я создаю сценарий, который поможет обновить двоичный файл компиляции GoLang в системе GNU/Linux.

Но это не удается

#!/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

    ## 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]}" показу значения в следующем цикле цикла

Перед каждым из ваших циклов for добавьте typeset -p go_jversion, чтобы показать содержимое массива; со 2-м набором вывода теперь пройдите 2-й цикл for и посмотрите, что вы получите для каждого набора $i-1, $i и $i+1

markp-fuso 14.02.2023 15:40
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Массивы в 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 выглядит как мой массив выше, вы можете поместить что-то в sversion[0] из jversion[0], затем обработать jversion[2] и попытаться сопоставить его с sversion[1], которого еще не существует.

Один простой способ де-разреживания массива состоит в том, чтобы переназначить его:

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

Это переназначит содержимое массива самому себе в последовательном порядке без пробелов в индексах.

Если по какой-то причине это невозможно, вам придется написать код, учитывающий возможную разреженность массива. Например, вместо слепого взгляда на go_sversion[i-1] вы можете посмотреть на go_sversion[-1], что всегда даст вам последний элемент в массиве.

Здравствуйте, большое спасибо, каким способом я могу удалить индекс вместо значения?, поэтому у меня нет неиспользуемого индекса.

Walddys E. Dorrejo Céspedes 20.02.2023 17:57

Я добавлю пример к ответу.

tjm3772 20.02.2023 18:36

Не могу отредактировать предыдущий комментарий. Редактировать: ------- Нашел решение и теорию работы массива, которую я проигнорировал: stackoverflow.com/questions/16860877/… Благодаря вашей помощи я пытаюсь работать по-другому и нашел предыдущий пост, как это сделать. Большое спасибо

Walddys E. Dorrejo Céspedes 20.02.2023 19:04

Другие вопросы по теме