在函数内声明全局变量

Leo*_*d99 21 bash shell scope

我想做的是跟随.在函数内部,我需要为变量赋值,该变量的名称取自另一个变量.换一种说法:

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自动创建名为arg1value的变量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".


Wil*_*ell 7

由于这是标记的shell,重要的是要注意它declare只是在一组有限的shell 中是有效的关键字,所以它是否支持-g是没有实际意义的.要在通用Bourne shell中执行此类操作,您只需使用eval:

eval ${arg}=5
Run Code Online (Sandbox Code Playgroud)


gni*_*urf 6

我认为你需要printf内置的-v开关:

func() {
    printf -v "$var" '5'
}
var=var_name
func
echo "$var_name"
Run Code Online (Sandbox Code Playgroud)

将输出5.


Beo*_*ris 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)


min*_*ret 4

您可以将 var=value 构造为字符串并使用 bash 内置命令对其进行评估eval