Obtém o índice da matriz

2

Estou tentando obter o índice da matriz que estou interagindo dentro de um loop for. Eu estou fazendo algo parecido com

arr=( foo bar baz )
for i in $arr; do
  echo "index ${#arr}";
done

Mas isso só me dá o número de elementos na matriz, não o número da matriz atual. Como fazer isso?

    
por Braiam 01.01.2017 / 01:56

3 respostas

3

Como ninguém parece ter sugerido a resposta óbvia, eu vou.

Por que não apenas usar um loop numérico como usado em linguagens mainstream como C e Java?

for ((i = 1; i <= $#arr; i++)); do
    echo "Index: $i, value: ${arr[i]}"
done

Ou, ainda mais curto (e mais lento, e possivelmente um hog de memória com grandes matrizes):

for i in {1..$#arr}; do
    echo "Index: $i, value: ${arr[i]}"
done
    
por 01.01.2017 / 23:05
2

Você pode usar a correspondência literal de matriz junto com um sinalizador que retorna o índice atual para fazer isso:

arr=( foo bar baz )
for i in $arr; do
  echo "index ${arr[(ie)$i]}";
done

O sinalizador i retorna o índice e o sinalizador e modifica o comportamento i para corresponder literalmente à string. A expressão lê: para arr que string de correspondência $ i literalmente retorna o índice. Esse método tem a desvantagem de que você pode confiar apenas nele, se todos os elementos da matriz forem exclusivos. Caso contrário, você precisaria usar algum tipo de contador.

    
por 01.01.2017 / 01:56
1

Desde o zsh 5.0.6, você pode expandir o array e gerar índices com compactação:

for k v in "${(@)${=${(eQ):-'$( (( $#ary )) && echo {1..$#ary})'}}:^ary}"; do
  [[ -z $k ]] && continue
  echo "index: $k - value: $v"
done

Na verdade, eu não usaria isso (por medo do futuro eu me esfaquear), e seria lento para arrays com um grande número de elementos. Incrementar um contador seria mais eficiente, pois as matrizes em zsh não podem ser escassas.

    
por 01.01.2017 / 04:19

Tags