Enumerando todos os outros elementos da matriz em loop

Enumerando todos os outros elementos da matriz em loop

Eu tenho uma matriz dinâmica com valores de pares de chaves e gostaria de enumerartodos os outrosvalor. Neste caso, apenas os nomes do array. Como não estou usando o bash v4, consegui seqpercorrer um array usando echo.

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

Isso retorna um elemento a mais do que os pares que tenho (devido ao deslocamento 0), mas posso explicar isso usando matemática simples:

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

Isso funciona muito bem. Mas assim que tento extrair elementos $array, recebo um erro que não consigo explicar. Eu tentei com e sem a "matemática"

$ 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")

Como posso obter apenas os nomes dessa matriz dinâmica?

EDITAR:meu $BASH_VERSIONé 3.2.57(1)-release(Mac OS X 10.10.2)

EDITAR #2:Cheguei à conclusão de que possivelmente é um bug nesta versão. Como gerencio várias instâncias da AWS, decidi verificá-las e todas possuem bash 4.1.2(1). Atualizei meu Mac para esta versão e agora funciona. Obrigado por olhar, mas estou atribuindo isso a uma anomalia.

Responder1

Se quiser fazer um loop sobre elementos alternativos do array, este deve funcionar no bash 3.2:

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

Você poderia fazer coisas semelhantes xargs -0se fosse mais conveniente.

Se nenhum dos seus nomes incluir dois pontos (por exemplo), você poderá extrair os nomes em uma nova matriz como esta:

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

(Infelizmente você não pode definir o separador de campos como NUL.)

Tudo isso depende do fato de printfrepetir sua string de formato quantas vezes for necessário para usar todos os seus argumentos (comportamento Posix, portanto deve funcionar em qualquer versão do bash ou com o não-builtin printf). O formato ocasionalmente útil %.0susa um argumento e imprime no máximo 0 caracteres dele, ou seja, coloca-o no bitbucket.

informação relacionada