Se eu tiver uma matriz com 5 elementos, por exemplo:
[a][b][c][d][e]
Usando echo ${myarray[4]}
eu posso ver o que ele contém.
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 array?
Eu gostaria de saber como fazer isso no bash.
$@
não é exatamente uma matriz (não pode ser subscrito). Para isso, consulte Obtendo o último argumento passado para um shell script .Respostas:
Você pode apenas usar um índice negativo
${myarray[-1]}
para obter o último elemento. Você pode fazer o mesmo pelo penúltimo e assim por diante; em Bash:O mesmo também funciona para atribuição. Quando diz "expressão", realmente significa uma expressão; você pode escrever em qualquer expressão aritmética existente para calcular o índice, incluindo uma que calcule usando
${#myarray[@]}
explicitamente o comprimento da matriz .fonte
ksh
ezsh
bem.zsh
entanto, por padrão, as matrizes são indexadas 1, ao contráriobash
eksh
onde são indexadas 0.Modern bash (v4.1 ou melhor)
Você pode ler o último elemento no índice
-1
:Suporte para acessar matrizes indexadas numericamente a partir do final usando índices negativos iniciados com a versão 4.1-alpha do bash .
Bash mais antigo (v4.0 ou anterior)
Você deve obter o comprimento da matriz
${#a[@]}
e subtrair um para obter o último elemento:Como o bash trata os subscritos da matriz como uma expressão aritmética, não há necessidade de notação adicional, como
$((...))
forçar a avaliação aritmética.fonte
modern
com uma versão.bash
atribuição de matriz, referência, configuração com índice negativo foram adicionadas apenas no bash 4.3 . Com a versão anteriorbash
, você pode usar expressão no índicearray[${#array[@]-1}]
Outra maneira, também trabalhe com a versão mais antiga do
bash
(bash 3.0 ou melhor):ou:
Usando o deslocamento negativo, é necessário separar
:
com-
para evitar ser confundido com a:-
expansão.fonte
"${a[@]: -1}"
e ele funcionará (além de )bash
ezsh
também dentroksh
.zsh
oubash
, mas eu testei em todos os três conchas.)matriz
As alternativas mais antigas no bash (Desde o bash 3.0+) são:
O espaço é necessário para evitar a interpretação de
:
seguido por um sinal de menos-
como a expansão de"${var:-abc}"
(Usar valores padrão).A
~
é uma negação aritmética bit a bit (equivalente ao complemento de uma pessoa ou inverter todos os bits ). De man bash:Desde o bash-4.2 + também:
Desde o bash 5.0 ou superior:
Para todas as versões do bash (bash mais antigo):
@
Para argumentos posicionais (desde o bash 2.01):
Uma solução portátil para todos os shells é usar eval:
fonte
~
no manual e não vê-lo.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
referência (verifique a resposta expandida no título @). @TomHale@
é um array (bom, não totalmente um array ) no bash e não aceita o índice ( ) subscrito para argumentos individuais. Você precisa usar ou equivalente. Verifique a entrada expandida no título. @TomHale[]
${@:(-1)}
@
Você também pode fazer isso:
Resultado:
O que você está fazendo é obter toda a contagem de elementos na matriz e subtrair -1, devido à obtenção de todos os elementos, não começando pelo índice da matriz que é 0.
fonte