Перечисление каждого второго элемента массива в цикле

Перечисление каждого второго элемента массива в цикле

У меня есть динамический массив со значениями пары ключей, и я хотел бы перечислитькаждый второйзначение. В этом случае, только имена в массиве. Поскольку я не использую bash v4, я смог использовать seqдля пошагового прохождения массива с помощью echo.

$ array=(Guido yes Francesca no Balthazar yes)
for x in $(seq 0 2 ${#array[@]});do echo $x;done
0
2
4
6

Это возвращает на один элемент больше, чем у меня есть пар (из-за нулевого смещения), но я могу учесть это, используя простую математику bash:

for x in $(seq 0 2 $((${#array[@]}-1)));do echo $x;done
0
2
4

Это работает просто отлично. Но как только я пытаюсь вытащить элементы из $array, я получаю ошибку, которую не могу объяснить. Я пробовал и с "математикой", и без нее

$ for x in $(seq 0 2 $((${#array[@]}-1)));do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

$ for x in $(seq 0 2 ${#array[@]});do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

Как мне получить только имена из этого динамического массива?

РЕДАКТИРОВАТЬ:мой $BASH_VERSION(3.2.57(1)-releaseMac OS X 10.10.2)

ПРАВКА №2:Я пришел к выводу, что это, возможно, ошибка в этой версии. Поскольку я управляю несколькими экземплярами AWS, я решил проверить их, и у всех них bash 4.1.2(1). Я обновил свой Mac до этой версии, и теперь это работает. Спасибо за внимание, но я списываю это на аномалию.

решение1

Если вы хотите перебрать альтернативные элементы массива, это должно работать в bash 3.2:

while IFS= read -d '' -r name; do
  # do something with "$name"
done < <(printf %s%.0s\\0 "${array[@]}")

Вы могли бы сделать то же самое, xargs -0если бы это было удобнее.

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

IFS=: read -a names -r < <(printf %s%.0s: "${array[@]}")

(К сожалению, вы не можете установить разделитель полей на NUL.)

Все они зависят от того факта, что printfповторяет свою строку формата так часто, как это необходимо для использования всех ее аргументов (поведение Posix, поэтому оно должно работать в любой версии bash или с не встроенным printf). Иногда полезный формат %.0sиспользует аргумент и выводит из него не более 0 символов, то есть помещает его в битбакет.

Связанный контент