bash atribuir variável com base no nome da variável

2

Eu gostaria de escrever uma função bash onde eu forneço uma string e atribui o valor "hi" a uma variável com o nome da string. Tenho certeza de que isso foi respondido antes, mas não sei a palavra-chave para procurar no manual.

myfunc() {
  ## some magic with $1
  ## please help me fill in here.
}

myfunc "myvar"
echo $myvar
> hi

Depois da resposta. Obrigado rapazes. Eu escrevi uma função para procurar por uma variável de ambiente e perguntar se ela não está lá. Gostaria de receber quaisquer melhorias. Eu acredito que funciona.

get_if_empty() {
    varname=$1
    eval test -z $'echo ${varname}';
    retcode=$?
    if [ "0" = "$retcode" ]
    then
        eval echo -n "${varname} value: "
        read 'echo $1' # get the variable name
    fi
    eval echo "$1 = $'echo ${varname}'"

}

Aqui está o uso:

get_if_empty MYVAR
    
por engineerchuan 19.11.2011 / 19:31

3 respostas

3

De man bash

   eval [arg ...]
          The  args are read and concatenated together into a single command.  This command is then read and executed by the shell, and its exit status is returned as the value of
          eval.  If there are no args, or only null arguments, eval returns 0

Então

myfunc() {
    varname=$1
    eval ${varname}="hi"
}

myfunc "myvar"
echo $myvar
    
por 19.11.2011 / 19:40
1

Sua função get_if_empty é muito mais complicada do que precisa ser. Aqui está uma versão muito simplificada:

get_if_empty() {
    if [ -z "${!1}" ]; then   # ${!var} is an "indirect" variable reference.
        read -p "$1 value: " $1
    fi
}
    
por 19.11.2011 / 22:32
0
#!/bin/bash
indirect() {
    [[ "$1" == "get" ]] && {
        local temp="$2"
        echo ${!temp}
    }
    [[ "$1" == "set" ]] && read -r $2 <<< "$3"
}

indirect set myvar Hi
echo $myvar

Hi=$(indirect get myvar)
indirect get Hi

double=$(indirect get $Hi)
indirect get $double
    
por 19.11.2011 / 20:09

Tags