Я имею два для циклов:
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
Как сделать это?
Вы могли определить два массива той же длины со значениями, по которым Вы хотите выполнить итерации сначала. Затем можно выполнить итерации по индексам одного из массивов и искать их в обоих:
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]}
.
Другая возможность состояла бы в том, чтобы использовать ассоциативный массив (иначе хеш иначе словарь) и затем выполнить итерации по нему и ключи получения и значения соответственно:
#!/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