criando variável usando o valor da variável como parte do novo nome da variável

4

Estou tentando criar uma nova variável usando o valor de uma variável existente como parte do nome da variável.

filemsg"$word1"=" "

Eu também tentei

filemsg$word1=" "

filemsg${word1}=" "

em todas as tentativas eu recebo o seguinte quando essa linha é executada,

cicserrors.sh[45]: filemsgCICS= : not found [No such file or directory]
    
por dazedandconfused 01.11.2013 / 12:51

6 respostas

8

Use eval :

filemsgCICS=foo
word1=CICS
eval "echo \"\$filemsg$word1\"" # => foo
eval "filemsg$word1=bar"
echo "$filemsgCICS" # => bar

mas pense duas vezes se você realmente precisar desse jeito.

Outra forma em ksh93 é usar namerefs :

word1=CICS
nameref v=filemsg$word1
v="xxx" 
echo "$filemsgCICS" # => xxx

Para hacks ainda mais desagradáveis como esse, aqui .

    
por 01.11.2013 / 12:55
3

export faz isso com muito mais segurança do que eval porque não há perigo de executar código de shell após um token de shell. Mas isso faz export das variáveis, então você pode usar como quiser.

export "filemsg$word1= "
    
por 22.08.2014 / 15:47
2

Não é POSIX , mas em bash há sempre printf -v , que imprime não na saída padrão, mas em qualquer nome de variável que segue -v :

x=foo; printf -v $x bar; echo $foo

Saída:

bar
    
por 09.04.2018 / 05:15
1

Tente isso

let filemsg"$word1"=" "

Esta pode não ser a melhor solução, mas funcionou para mim no passado.

    
por 09.04.2018 / 03:58
0

Tente isto:

word1=CICS

var_name=filemsg$word1

eval ${var_name}="var_value"

Para testar:

echo $filemsgCICS ==> var_value
    
por 27.09.2018 / 02:06
-1

Tente isto:

filemsgCICS=foo

word1=CICS

ref_filemsg=filemsg$word1

echo ${!ref_filemsg} => foo
    
por 26.09.2018 / 20:37