Variável relacionada à variável

1

Eu quero ter efeito como abaixo, mas eu não sei como:

$> A='/dir'
$> B="$A/bin"
$> echo $B
/dir/bin
$> A='/other'
$> echo $B
/other/bin

alguma ideia?

    
por Krzysztof Szewczyk 09.03.2015 / 14:03

3 respostas

1

O Ksh93 tem uma forma restrita disso, onde uma variável pode ser uma referência indireta a outra variável:

$ A=/dir
$ typeset -n B=A
$ echo $B
/dir
$ A=/other
$ echo $B
/other

Nenhuma das conchas usuais possui variáveis cuja expansão ocorre duas vezes. O Bash tem um recurso de referência indireta semelhante ao do ksh, mas com uma sintaxe diferente: você precisa especificar que deseja uma referência indireta no momento do acesso, não no momento da definição.

$ A=/dir
$ B=A
$ echo ${!B}
/dir
$ A=/other
$ echo ${!B}
/other

Em geral, o valor de uma variável só muda quando você atribui a ela. Se você quiser algo que seja recalculado toda vez que acessá-lo, recupere a saída de um comando .

Se o que você deseja é alterar dinamicamente o valor das variáveis usadas por outros programas, como PATH e LD_LIBRARY_PATH , isso é impossível, independentemente do recurso avançado que o shell tenha. Depois que um programa é iniciado, suas variáveis de ambiente são as que ele recebeu quando foi iniciado; Alterar o valor em um shell não afeta os valores em um processo que já está em execução.

Se você quiser alterar os valores dessas variáveis com base em alguns eventos, poderá fazê-lo executando o código do shell. Por exemplo, você pode fazer o bash executar algum código toda vez que ele exibir um prompt ou quando o diretório atual é alterado . Novamente, isso não afetará os programas que já estão em execução.

    
por 10.03.2015 / 01:11
0

Se você quiser algo como uma variável de modelo, pode eval a expansão ...

A=/dir
B=\$A/bin
eval echo $B

A=/other
eval echo $B
    
por 09.03.2015 / 14:08
0

Variáveis não se comportam assim. O que você quer é uma função :

B () {
    echo "$A/bin"
}

A=/dir
echo $(B)

A=/other
echo $(B)
    
por 09.03.2015 / 14:20

Tags