Синхронизируемая комбинация для вывода циклов

Я имею два для циклов:

for i in 0 1 2 3; do echo $i;done
for j in a b c d; do echo $j;done
0
1
2
3
a
b
c
d

Я хочу вывод быть:

0
a
1
b
2
c
3
d

Как сделать это?

1
задан 18 November 2018 в 16:52

2 ответа

Вы могли определить два массива той же длины со значениями, по которым Вы хотите выполнить итерации сначала. Затем можно выполнить итерации по индексам одного из массивов и искать их в обоих:

arr1=(0 1 2 3)
arr2=(a b c d)

for i in ${!arr1[@]}; do
    echo ${arr1[i]}
    echo ${arr2[i]}
done

# Output below:
0
a
1
b
2
c
3
d

Определение массивов работает путем присвоения списка элементов в круглых скобках, как Вы видите на первых двух строках.

Для цикла выполняет итерации ${!arr1[@]}, который возвращает список всех ([@]) индексы (!) из переменной типа массив arr1. Это может использоваться здесь, потому что мы принимаем это оба arr1 и arr2 имейте точно те же индексы, потому что они были определены с тем же числом элементов. В теории массивы могли иметь различные длины или даже иметь "дыры" т.е. отменили назначение промежуточных индексов, но оба не имеют место здесь, таким образом, мы не заботимся о ней.

Доступ к определенному значению элемента массива в положении определяется значением переменной $i работы путем ввода ${arr1[i]}.

5
ответ дан 3 December 2019 в 06:22

Другая возможность состояла бы в том, чтобы использовать ассоциативный массив (иначе хеш иначе словарь) и затем выполнить итерации по нему и ключи получения и значения соответственно:

#!/usr/bin/env bash

declare -A items=( 
    [0]=a 
    [1]=b
    [2]=c
    [3]=d
    [four]=eeh
);

for key in "${!items[@]}"; do
    echo "key  : $key";
    echo "value: ${items[$key]}";
done

Вывод:

key  : 0
value: a
key  : 1
value: b
key  : 2
value: c
key  : 3
value: d
key  : four
value: eeh
3
ответ дан 3 December 2019 в 06:22

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

Похожие вопросы: