Назад | Перейти на главную страницу

bash назначить переменную на основе имени переменной

Я хотел бы написать функцию bash, в которой я предоставляю строку, и она присваивает значение «привет» переменной с этим именем строки. Я уверен, что на это уже был дан ответ, но я не знаю ключевое слово для поиска в руководстве.

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

myfunc "myvar"
echo $myvar
> hi

После ответа. Спасибо, парни. Я написал функцию для поиска переменной среды и запроса ее, если ее нет. Буду признателен за любые улучшения. Я считаю, что это работает.

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}`"

}

Вот использование:

get_if_empty MYVAR

Из 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

Так

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

myfunc "myvar"
echo $myvar

Ваша функция get_if_empty намного сложнее, чем должна быть. Вот сильно упрощенная версия:

get_if_empty() {
    if [ -z "${!1}" ]; then   # ${!var} is an "indirect" variable reference.
        read -p "$1 value: " $1
    fi
}
#!/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