Enumerando todos os outros elementos da matriz em loop

0

Eu tenho um array dinâmico com valores de pares de chaves e gostaria de enumerar todos os outros valores. Neste caso, apenas os nomes na matriz. Como não estou usando o bash v4, pude usar seq para percorrer uma matriz 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 mais um elemento do que os pares que eu tenho (devido a 0 offset), mas eu posso explicar isso usando o bash math simples:

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

Isso funciona muito bem. Mas assim que eu tento extrair elementos de $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 )

EDIT # 2: Eu cheguei à conclusão de que este é possivelmente um bug nesta versão. Como eu gerencio várias instâncias da AWS, decidi checá-las e todas elas têm o bash 4.1.2 (1). Eu atualizei meu Mac para esta versão e isso agora funciona. Obrigado por olhar, mas estou escrevendo isso para uma anomalia.

    
por SaxDaddy 14.03.2015 / 03:21

1 resposta

2

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ê pode fazer coisas semelhantes com xargs -0 , se isso for 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 campo como NUL).

Tudo isso depende do fato de que printf repete sua string de formato tão frequentemente quanto necessário para usar todos os seus argumentos (comportamento do Posix, por isso deve funcionar em qualquer versão bash ou com o não-construído em printf ). O formato ocasionalmente útil %.0s usa um argumento e imprime no máximo 0 caracteres dele, o que significa que ele é colocado no bitbucket.

    
por 15.03.2015 / 06:06