Shell Scripting - Итерация массива не работает правильно - Вложено для цикла - PullRequest
0 голосов
/ 31 октября 2018

Итак, у меня есть два массива:

arr1=("A" "C" "E")
arr2=("B" "D" "F")

У меня есть такие вложенные циклы:

 for i in $(seq 1 $numberOfYears); 
    do
        echo "$i"
        for j in "${arr1[@]}";
            do
                echo ${arr1[j]} <---Keeps printing "A" 
                echo ${arr2[j]} <---Keeps printing "B" 
            done
    done

Новое в программировании сценариев оболочки. Что заставило бы внутренний цикл for правильно перебирать array1 когда вы ссылаетесь на элемент следующим образом: $j, но не так ${arr1[j]} и ${arr2[j]} ..? Во всех мое чтение / поиск, это должно правильно перебрать оба массива.

Мои ожидаемые результаты:

Ожидаемое

 1ABCDEF
 2ABCDEF
 3ABCDEF

Фактический

 1ABABAB
 2ABABAB
 3ABABAB

Если я изменю ${arr1[j]} на $j, он работает нормально, но мне нужно получить также элементы arr2, поэтому я должен получить его как ${arr2[j]}.

1 Ответ

0 голосов
/ 31 октября 2018

Вы перебираете значения массива.

Вы можете зациклить клавиши, если хотите, используя "${!arr1[@]}" (добавьте !):

for i in $(seq 1 $numberOfYears); 
do
    echo "$i"
    for j in "${!arr1[@]}";
    do
        echo ${arr1[j]}
        echo ${arr2[j]}
    done
done

В противном случае вы расширяете параметры, например ${arr1["A"]}, и, поскольку эти ключи не определены, вы получаете первый элемент массива.

Кроме того, вы можете использовать другой стиль цикла для перебора числовых ключей:

for (( i = 0; i <= numberOfYears; ++i ))
do
  echo "$i"
  for (( j = 0; j < ${#arr1[@]}; ++j ))
  do
    echo "${arr1[j]}"
    echo "${arr2[j]}"
  done
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...