我想做的是跟随.在函数内部,我需要为变量赋值,该变量的名称取自另一个变量.换一种说法:
func() {
#
# Here happens something that ultimately makes $arg="var_name"
#
declare -g ${arg}=5
}
func
echo ${var_name}; # Prints out "5"
Run Code Online (Sandbox Code Playgroud)
上面的代码片段在bash 4.2中运行良好.但是,在4.2之前的bash中,declare
没有-g
选项.我在google上发现的一切都说要在函数中定义全局变量,我应该只使用var=value
语法,但不幸的是,var
它本身依赖于另一个变量.${arg}=5
也行不通.(它说-bash: var_name=5: command not found
.
对于好奇,所有这一切的原因是这个函数实际上从脚本参数创建全局变量,即运行script --arg1=val
自动创建名为arg1
value的变量val
.节省了大量的样板代码.
小智 14
declare
函数内部无法按预期工作.我需要在函数中声明的只读全局变量.我在一个函数内尝试了这个,但它不起作用:
declare -r MY_VAR=1
Run Code Online (Sandbox Code Playgroud)
但这没效果.使用readonly
命令执行:
func() {
readonly MY_VAR=1
}
func
echo $MY_VAR
MY_VAR=2
Run Code Online (Sandbox Code Playgroud)
这将打印1并为第二个赋值给出错误"MY_VAR:readonly variable".
由于这是标记的shell
,重要的是要注意它declare
只是在一组有限的shell 中是有效的关键字,所以它是否支持-g是没有实际意义的.要在通用Bourne shell中执行此类操作,您只需使用eval:
eval ${arg}=5
Run Code Online (Sandbox Code Playgroud)
我认为你需要printf
内置的-v
开关:
func() {
printf -v "$var" '5'
}
var=var_name
func
echo "$var_name"
Run Code Online (Sandbox Code Playgroud)
将输出5
.
使用“eval”(或任何直接赋值)会让您对特殊字符(或值注入等问题)感到头疼。
我只使用“阅读”就取得了巨大的成功
$ function assign_global() {
> local arg="$1"
> IFS="" read -d "" $arg <<<"$2"
>}
$ assign_global MYVAR 23
echo $MYVAR
23
$ assign_global MYVAR "\"'"
"'
Run Code Online (Sandbox Code Playgroud)