Salva o valor de retorno de uma função em um dos seus próprios parâmetros

2

Isso é o que eu quero alcançar:

Função:

Func1() {
   $1="Hello World"
}

Função de chamada:

local var1
Func1 var1
echo $var1  (should echo Hello World)

Eu encontrei este exemplo que parece funcionar, mas acho que usar o eval não é uma boa ideia:

Func1() {
   eval $1=$str1
}

Como seria a maneira correta de fazer isso?

Eu venho do .Net e geralmente uso um parâmetro como referência. Por exemplo, atribuir um valor de volta ao parâmetro que pode ser usado mais tarde.

No exemplo acima, var1 deve receber "Hello World"

(estou usando sh shell)

    
por MrCalvin 15.07.2016 / 19:08

1 resposta

1

eval é bom se você usá-lo corretamente:

Func1() {
  eval "$1=\$str1"
}

É seguro, contanto que Func1 seja chamado apenas com os nomes das variáveis que você pretende que sejam passados.

Como sempre, você precisa citar suas variáveis. E aqui, $str1 não precisa ser expandido antes de ser passado para eval .

Se Func1 pode ser passado a sequências arbitrárias que não estão sob o seu controle, então é aí que você obteria problemas com valores como reboot;foo e precisaria sanitizá-lo como:

Func1() {
  case $1 in
    "" |\
    *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
    [0123456789]* |\
    BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
      echo >&2 "Can't set that variable"
      return 1
  esac
  eval "$1=\$str1"
}

A criação de uma lista completa de variáveis problemáticas é uma tarefa condenada.

    
por 06.09.2016 / 18:42