Existe uma maneira simples de inverter uma matriz?
#!/bin/bash
array=(1 2 3 4 5 6 7)
echo "${array[@]}"
então eu obteria: 7 6 5 4 3 2 1
em vez de:1 2 3 4 5 6 7
Existe uma maneira simples de inverter uma matriz?
#!/bin/bash
array=(1 2 3 4 5 6 7)
echo "${array[@]}"
então eu obteria: 7 6 5 4 3 2 1
em vez de:1 2 3 4 5 6 7
Outra abordagem não convencional:
Resultado:
Se
extdebug
estiver habilitado, o arrayBASH_ARGV
contém em uma função todos os parâmetros posicionais na ordem inversa.Abordagem não convencional (nem tudo puro
bash
):se todos os elementos em uma matriz tiverem apenas um caractere (como na pergunta), você poderá usar
rev
:por outro lado:
e se puder usar
zsh
:Eu respondi à pergunta conforme escrita e este código inverte a matriz. (Imprimir os elementos na ordem inversa sem inverter a matriz é apenas um
for
loop de contagem regressiva do último elemento até zero.) Este é um algoritmo padrão de "trocar primeiro e último".Funciona para arrays de comprimento ímpar e par.
Se você realmente deseja o inverso em outra matriz:
Então:
Dá:
Isso deve lidar corretamente com os casos em que um índice de matriz está ausente, digamos que você tenha
array=([1]=1 [2]=2 [4]=4)
, caso em que o loop de 0 para o índice mais alto pode adicionar elementos vazios adicionais.Para trocar as posições do array no lugar (mesmo com arrays esparsos) (desde o bash 3.0):
Na execução:
Para bash mais antigo, você precisa usar um loop (no bash (desde 2.04)) e usar
$a
para evitar o espaço à direita:Para bash desde 2.03:
Além disso (usando o operador de negação bit a bit) (desde o bash 4.2+):
Feio, impossível de manter, mas uma linha:
Para inverter uma matriz arbitrária (que pode conter qualquer número de elementos com quaisquer valores):
Com
zsh
:Com
bash
4.4+, dado quebash
as variáveis não podem conter bytes NUL de qualquer maneira, você pode usar GNUtac -s ''
nos elementos impressos como registros delimitados por NUL:Observe, no entanto, que os arrays bash foram inspirados em arrays ksh em vez de arrays csh/zsh e são mais como arrays associativos com chaves limitadas a inteiros positivos (os chamados arrays esparsos ), e esse método não preserva as chaves dos arrays. Por exemplo, para qualquer array como:
você consegue
POSIXly, para inverter a única matriz de shell POSIX (
$@
, made of$1
,$2
...) no lugar:Solução bash pura, funcionaria como uma linha única.
Embora eu não vá contar algo novo e também usarei
tac
para inverter o array, acho que vale a pena mencionar abaixo a solução de linha única usando o bash versão 4.4:Teste:
Lembre-se de que o nome da var dentro de read é o nome da matriz original, portanto, nenhuma matriz auxiliar é necessária para armazenamento temporário.
Implementação alternativa ajustando o IFS:
PS: Acho que as soluções acima não funcionarão na
bash
versão abaixo4.4
devido àread
implementação diferente da função interna do bash.Tente isso