Acho que um exemplo explicaria melhor o que eu preciso
_v1="windows"
_v2_windows="/mnt/d"
_v2_osx="/Volumes/d"
echo $_v2_`echo $_v1`
Eu quero ecoar o valor de _v2_windows
mas usando _v1
para determinar qual dos dois v2
s obter.
Eu sei que pode usar uma case
declaração para resolver o problema, mas estou tentando evitar isso.
Com
zsh
:${(P)varname}
expande para o valor da variável cujo nome está armazenado em$varname
. Portanto, se$varname
contémvar
,${(P)varname}
expande para a mesma coisa que$var
.${(e)var}
expande para o conteúdo de,$var
mas também executa expansões de parâmetros, substituição de comandos e expansão aritmética dentro. Portanto, se$var
contém$othervar
,${(e)var}
expande para a mesma coisa que$othervar
.${(P)${var:-something}}
trabalho${:-content}
é uma maneira de ter uma expansão de parâmetro expandida para texto arbitrário (aquicontent
)(veja o manual para detalhes)
Então você poderia fazer:
Ou:
Ou faça isso em duas etapas:
Ou:
Ou você pode usar a sintaxe POSIX padrão:
Esteja ciente de que, se o valor de
$_v1
não estiver sob seu controle, tudo isso equivale a uma vulnerabilidade de injeção de comando arbitrária, você precisa primeiro limpar o valor.Observe também que
zsh
suporta arrays associativos (e tem muito antesbash
de ), então você pode fazer:O que seria muito mais legível e não teria nenhuma dessas implicações de segurança.
alternativamente
Em ambos os casos, o sinalizador de expansão de parâmetro
(P)
é usado para expandir o nome dentro${...}
do nome da variável real da qual gostaríamos de obter o valor.Isso é semelhante à indireção variável
${!...}
nobash
shell.