Tenho certeza de que é relativamente simples, simplesmente não sei como fazê-lo.
#!/usr/bin/ksh
set `iostat`
myvar=6
Eu quero algo como o echo ${$myvar}
que eu quero interpretado como ${$myvar}
-> ${6}
->value
shell-script
ksh
variable-substitution
Brandon Kreisel
fonte
fonte
Respostas:
Você pode fazer isso com
eval
, embutido em muitos shells finos, incluindo o ksh:O truque é colocar aspas duplas na string que você alimenta para
eval
que $ myvar seja substituído por "6" e barra invertida no cifrão externo, paraeval
obter uma string "$ 6".Eu obtive "% user" para a saída, mas tentei em uma máquina RHEL com vários processadores.
fonte
vv=$( eval "echo \$$vn" )
. Muito obrigado!Referência de variável indireta
Os shells avançados modernos têm um método para referenciar o valor de uma variável cujo nome é armazenado em outra variável. Infelizmente, o método difere entre ksh, bash e zsh.
No mksh ≥R39b, você pode criar
myvar
um nameref:Isso não funciona no ATT ksh93 porque não suporta namerefs para parâmetros posicionais. No caso de você ter uma variável que contém um nome de variável, você pode usar esse método.
No bash ≥2.0, você pode escrever
No zsh, você pode escrever
Em shells mais antigos, incluindo ksh88 e pdksh, seu único recurso é quando você tem uma variável que contém outro nome de variável e deseja usar o valor dessa variável
eval
, conforme explicado por Bruce Ediger . Esta solução funciona em qualquer shell Bourne / POSIX.Usando uma matriz
Este é o melhor método aqui: é mais simples e mais portátil.
Para o seu caso de uso, em qualquer shell com matrizes (todas as variantes do ksh, bash ≥2,0, zsh), você pode atribuir a uma variável da matriz e pegar o elemento que deseja. Cuidado para que as matrizes ksh e bash iniciem a numeração em 0, mas o zsh inicia em 1, a menos que você emita
setopt ksh_arrays
ouemulate ksh
.Se você deseja copiar os parâmetros posicionais para uma variável de matriz
a
:No ksh93, mksh ≥R39b, bash ≥2.0 e zsh, você pode usar a sintaxe de atribuição de matriz:
fonte
eval "vv=\${$vn}"
. Merci beaucoup, gentil senhor.Conforme indicado por Gilles (que forneceu a
bash
parte da resposta), também não invalidando a de Bruce Ediger (sobre como fazê-lo de forma portável), vejaeval
como fazê-lonameref
recentementemksh
(e na AT&T ksh93, exceto - como comentou o @Gilles - namerefs não pode se referir a parâmetros posicionais no AT&T ksh, apenas a parâmetros nomeados):Adicionado o
--
depoisset
para melhorar a resistência também.fonte
typeset: 6: invalid variable name
).Outro uso de matrizes
Não utilizo o ksh ou qualquer variante há algum tempo, por isso não tenho certeza se o ksh (ou bash) tem uma capacidade semelhante. Meu shell principal é o zsh. Eu uso matrizes ao lidar com a saída de comandos como o iostat porque eles produzem várias linhas, e nem todas as linhas têm o mesmo formato / comprimento.
O acima também ignora o uso de parâmetros posicionais. Agora, se você deseja gerar, digamos, uma matriz de dispositivos:
Acho pedaços menores muito mais fáceis de manusear. Você pode ou não precisar usar referência variável indireta, dependendo do seu código. Saber como funciona ainda é uma boa coisa para saber. Eu mesmo uso.
fonte