Bash关联数组变量作用域异常问题排查求助
检查函数是否在子shell中执行
如果调用func_vault_create_container时使用了管道(|)、后台执行(&)或者命令替换($()),函数会在子shell中运行。bash中关联数组默认不会被子shell继承(普通变量可以),导致函数内无法读取全局数组。可以去掉管道/后台执行,或者用shopt -s lastpipe(bash 4.2+)让管道最后一个命令在当前shell执行。检查关联数组的声明作用域
确认version_number.sh里的declare -A VAULT_SETTINGS没有加local关键字。如果加了local,数组会被限定在source时的局部作用域(比如如果是在某个函数内部source的这个文件),全局无法访问。另外,排查主脚本中有没有在其他地方(比如函数内部)重新执行declare -A VAULT_SETTINGS,这会重新创建一个局部数组,覆盖全局的。验证bash版本兼容性
关联数组是bash 4.0及以上版本才支持的特性。运行bash --version检查当前脚本使用的bash版本,如果低于4.0,关联数组无法正常工作,会出现“已加载但无法读取”的现象。需要切换到bash 4+版本运行脚本。排查是否存在变量被unset的情况
检查sourceversion_number.sh之后、调用func_vault_create_container之前的代码,有没有执行unset VAULT_SETTINGS或者unset VAULT_SETTINGS[SECRETS_ENGINE_PATH]这类命令,不小心清空了数组或元素。确认source与函数调用的顺序
虽然你说bash -x显示数组已加载,但再核对一遍:是否是先sourceversion_number.sh,再调用func_vault_create_container?如果顺序颠倒,函数执行时数组还未定义,自然读取不到值。
内容的提问来源于stack exchange,提问作者Shiunbird

