防止将bash数组名称更改为_ =(下划线等于)?

时间:2017-05-30 14:36:10

标签: bash scope

# 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

如何防止这种情况发生?

1 个答案:

答案 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选项。