# script.sh
get_config() {
declare -a liquibase_commands=( dropAll update )
declare -p | grep liquibase
}
main() {
get_config
declare -p | grep liquibase
}
main "$@"
$ bash script.sh
declare -a liquibase_commands='([0]="dropAll" [1]="update")'
declare -- _="liquibase_commands: [ ]"
我希望在调用liquibase_commands
之后设置main
get_config
declare -- _=
。但是,我看到target
。
如何防止这种情况发生?
答案 0 :(得分:4)
declare
在函数中使用时,隐含local
,即声明的变量在函数外部不可见。
要解决此问题,您可以使用-g
标志将数组显式声明为全局:
declare -ag liquibase_commands=( dropAll update )
这是在Bash 4.2中引入的。对于旧版本的Bash,您可以完全删除declare
,因为Bash自己发现liquibase_commands
是一个数组:
liquibase_commands=( dropAll update )
manual说明了使用declare
声明的变量的范围:
-g
选项强制在全局范围内创建或修改变量,即使在shell函数中执行declare
也是如此。在所有其他情况下都会被忽略。[...]
在函数中使用时,
declare
使每个名称都与local
命令一样,除非使用-g
选项。