bash призначити змінну на основі імені змінної


2

Я хотів би написати функцію 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

Перевірте Посібник із розширеного сценарію Bash: tldp.org/LDP/abs/html/ivr.html
Андрій

Відповіді:


3

З 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

1

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

get_if_empty() {
    if [ -z "${!1}" ]; then   # ${!var} is an "indirect" variable reference.
        read -p "$1 value: " $1
    fi
}

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.