为何调用Bash函数one时无输出?本地数组导出问题排查
问题原因分析与解决办法
这个问题的核心在于Bash中local变量声明的赋值时机与作用域优先级,咱们一步步拆解:
关键问题点
在函数two里的这行代码是问题根源:
local -a -x var=( ${var[@]} )
当Bash执行local var=(...)这种语句时,local会立即在当前函数的作用域内创建这个变量——也就是说,赋值符号右侧的${var[@]},已经不再指向父函数one里导出的那个var数组了,而是指向了刚被声明的、还未被赋值的空局部变量。最后自然就把var赋值成了空数组,echo的时候当然没输出。
修正方案
根据你的需求,有几种不同的修正方式:
方案1:不需要在two里重新声明局部变量
如果two只是需要读取父函数导出的var,完全不用重新声明,直接使用即可:
function two() { echo "${var[@]}" }
方案2:需要在two里创建局部且可导出的var
如果必须在two里保留local -a -x的声明,那要把声明和赋值分开,先让var引用父进程的变量,再赋值给局部变量:
function two() { local -a -x var # 先声明局部变量 var=( "${var[@]}" ) # 此时右侧的var是父进程导出的变量 echo "${var[@]}" }
方案3:先缓存父进程变量再赋值
也可以先把父进程的var值缓存到另一个变量里,再赋值给新的局部变量:
function two() { local parent_var=( "${var[@]}" ) # 先缓存父进程的数组 local -a -x var=( "${parent_var[@]}" ) echo "${var[@]}" }
内容的提问来源于stack exchange,提问作者Nikolaos Kakouros
相关产品推荐
相关产品推荐

