Eu tenho duas matrizes:
arrayA=(1 2 3)
arrayB=(a b c)
e quero imprimir um deles usando um argumento de linha de comando, ou seja, sem nenhum if else
.
Eu tentei algumas variações na sintaxe sem sucesso. Eu estou querendo fazer algo assim:
ARG="$1"
echo ${array${ARG}[@]}
mas recebo um erro de "substituição incorreta". Como posso conseguir isso?
Respostas:
Tente fazer isso:
NOTA
man bash
(expansão de parâmetro):fonte
!
fazendo na frente davar
variável? Como isso funciona, parecia substituir a história do Google, mas eu não conseguia ver como isso funcionava aqui.Embora você possa usar o acesso indireto, conforme indicado em outra resposta , outra maneira (no ksh e no Bash 4.3 e mais recente) seria usar o namerefs. Especialmente no caso de matrizes, isso pode ser mais útil, pois você pode indexar a matriz através do nameref e não precisa colocar o índice na variável usada como referência.
Isso não funciona através do acesso indireto:
Como um programador C pode colocar,
${!q[1]}
aqui age como se houvesseq
uma matriz de ponteiros, em vez de ser um ponteiro para uma matriz.fonte
nota: escape cotes em caso de espaço !
fonte
Foram necessárias muitas tentativas e erros, mas eventualmente funcionaram.
Tomei alguma inspiração de Youness. Mas todas as outras respostas não ajudaram na minha antiga festança (suse11sp1 [lançamento do 3.2.51 (1)])
O loop 'for' recusou-se a expandir a matriz indireta; em vez disso, você precisa pré-expandi-la. Use isso para criar outra matriz com seu novo nome de variável. Meu exemplo abaixo mostra um loop duplo, pois esse é o meu uso pretendido.
Estou usando # para excluir o "New_" da primeira entrada da matriz e concatenar com "things" para obter "FOOthings". \ $ {} com echo e eval, faça suas tarefas em ordem sem gerar erros, que são agrupados em um novo $ () e atribuídos ao novo nome da variável.
ATUALIZAÇÃO ##### 2018/06/07Eu descobri recentemente mais uma rodada sobre esse problema. A variável criada não é realmente uma matriz, mas uma sequência delimitada por espaço. Para a tarefa acima, isso foi bom, por causa de como "for" funciona, ele não lê a matriz, é expandido e depois percorre o loop, veja o extrato abaixo:
Mas, então eu precisava usá-lo como uma matriz. Para isso, eu precisava executar mais uma etapa. Eu peguei o código literalmente por Dennis Williamson . Eu testei e funciona bem.
O "IFS = ','" é uma variável que contém seu deliminador. "read" com "-a" corta e alimenta a picada de volta na variável da matriz. Observe que isso não respeita as aspas, mas existem algumas opções na leitura para gerenciar isso; por exemplo, removi o sinalizador -r do qual não precisava. Portanto, agora combinei essa adição na criação de variáveis, que permite que os dados sejam tratados e endereçados como deveriam.
fonte
de jeito nenhum :(
se suas matrizes forem tão simples, use matrizes associativas
infelizmente, se suas matrizes forem mais complicadas (por exemplo
array=( "a b" c )
), isso não funcionaria. Então, você precisa pensar mais sobre outra maneira de alcançar seu objetivo.fonte
Usar
eval
fonte
É assim que você criaria uma variável nomeada dinamicamente (versão bash <4.3).
Abaixo está um grupo de funções que podem ser usadas para gerenciar matrizes nomeadas dinamicamente (versão bash <4.3).
Abaixo está um grupo de funções que podem ser usadas para gerenciar matrizes nomeadas dinamicamente (versão bash> = 4.3).
Para obter mais detalhes sobre esses exemplos, visite Getting Bashed by Dynamic Arrays de Ludvik Jerabek
fonte