Я хотел бы написать функцию 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