Existe uma maneira de ler o último elemento de um array com o bash?

53

Se eu tiver uma matriz com 5 elementos, por exemplo:

[a][b][c][d][e]

Usando echo ${myarray[4]} , posso ver o que é válido.

Mas e se eu não soubesse o número de elementos em uma determinada matriz? Existe uma maneira de ler o último elemento de uma matriz de comprimento desconhecido? Ou seja, o primeiro elemento lendo da direita para a esquerda para qualquer matriz?

Eu gostaria de saber como fazer isso no bash.

    
por 3kstc 27.04.2015 / 06:37

4 respostas

70

Você pode apenas usar um índice negativo ${myarray[-1]} para obter o último elemento . Você pode fazer a mesma coisa pela segunda e assim por diante; no Bash:

If the subscript used to reference an element of an indexed array evaluates to a number less than zero, it is interpreted as relative to one greater than the maximum index of the array, so negative indices count back from the end of the array, and an index of -1 refers to the last element.

O mesmo também funciona para atribuição. Quando diz "expressão", isso realmente significa uma expressão; você pode escrever em qualquer expressão aritmética lá para calcular o índice, incluindo um que calcule usando o comprimento da matriz ${#myarray[@]} explicitamente.

    
por 27.04.2015 / 06:41
33

Festa moderna (v4.1 ou melhor)

Você pode ler o último elemento no índice -1 :

$ a=(a b c d e f)
$ echo ${a[-1]}
f

Suporte para acessar arrays numericamente indexados do final usando índices negativos iniciados com a versão bash 4.1-alpha .

Bash mais antigo (v4.0 ou anterior)

Você deve obter o comprimento da matriz em ${#a[@]} e, em seguida, subtrair um para obter o último elemento:

$ echo ${a[${#a[@]}-1]}
f

Como o bash trata os subscritos da matriz como uma expressão aritmética, não há necessidade de uma notação adicional, como $((...)) , para forçar a avaliação aritmética.

    
por 27.04.2015 / 06:40
13
A atribuição da matriz

bash , a referência, a desativação com índice negativo, foram apenas adicionados na bash 4.3 . Com a versão mais antiga de bash , você pode usar a expressão no índice array[${#array[@]-1}]

De outra forma, trabalhe também com versões antigas de bash (bash 3.0 ou superior):

$ a=([a] [b] [c] [d] [e])
$ printf %s\n "${a[@]:(-1)}"

ou:

$ printf %s\n "${a[@]: -1}"

Usando o deslocamento negativo, você precisa separar : com - para evitar confundir-se com a expansão :- .

    
por 27.04.2015 / 06:50
0

Além disso, você pode fazer isso:

$ a=(a b c d e f)
$ echo ${a[$(expr ${#a[@]} - 1)]}

Resultado:

$ f

O que você está fazendo é obter toda a contagem de elementos na matriz e subtrair -1, pois você está obtendo todos os elementos, não começando pelo índice da matriz que é 0.

    
por 13.03.2017 / 21:43

Tags