【问题标题】:Bash Array value in default value assignment默认值赋值中的 Bash 数组值
【发布时间】:2016-08-22 01:13:43
【问题描述】:

我正在尝试将一个包含三个值的数组分配给一个变量,如果它还没有被该行分配

: ${SEAFILE_MYSQL_DB_NAMES:=(ccnet-db seafile-db seahub-db)}

不幸的是,回显${SEAFILE_MYSQL_DB_NAMES[@]} 会导致(ccnet-db seafile-db seahub-db)${SEAFILE_MYSQL_DB_NAMES[2]} 什么也不打印。看来,该值已被解释为字符串而不是数组。有什么办法可以让我的脚本以这种方式分配一个数组?

这个问题发生在 Debian Jessie 的 bash 4.3.30 上(如果重要的话,在 docker 容器中)。有趣的是,相同的代码可以在 Ubuntu 16.04 和 bash 版本 4.3.42 上运行,正如我所期望的那样,它被作为一个数组处理。

【问题讨论】:

  • 你确定这适用于你的 Ubuntu 机器吗?我刚刚在我的 debian 不稳定机器上使用GNU bash, version 4.3.42(1)-release 进行了尝试,但它并没有按照您所说的方式工作。这一切都说我不确定我什至会期望这首先会起作用。数组分配与:=/= 扩展不同。
  • @EtanReisner 你说得对,一定是在测试时出错了,它在 Ubuntu 机器上的行为是一样的。 “数组分配与:=/= 扩展不同”到底是什么意思?我假设在默认值构造中分配一个值与简单地以正常方式分配它时的行为相同(即SEAFILE_MYSQL_DB_NAMES=(ccnet-db seafile-db seahub-db) 导致数组变量)
  • := 扩展与简单赋值不同。没有理由假设它们必须以相同的方式工作。普通数组分配是一个特定的“复合分配”,没有什么说:= 扩展需要支持相同的复合分配。它当然可以以这种方式工作,但我认为这不是必要的假设/扩展。

标签: arrays bash default-value colon


【解决方案1】:

如何分几个阶段进行?先声明fallback数组,然后检查SEAFILE_MYSQL_DB_NAMES是否被设置,如果需要就赋值。

DBS=(ccnet-db seafile-db seahub-db)
[[ -v SEAFILE_MYSQL_DB_NAMES ]] || read -ra SEAFILE_MYSQL_DB_NAMES <<< ${DBS[@]}

基于this answer

【讨论】:

  • 这不起作用—SEAFILE_MYSQL_DB_NAMES 设置为DBS 而不是(ccnet-db seafile-db seahub-db)
  • 哎呀,它仍然返回字符串而不是数组,我现在使用了不同的方法。
  • 在变量扩展时使用引号来防止分词和路径名扩展。
  • @heemayl,但是数组应该用空格分割,不是吗?什么意思?
猜你喜欢
  • 2018-08-20
  • 2011-06-17
  • 1970-01-01
  • 2017-07-12
  • 2010-09-14
  • 1970-01-01
  • 2012-07-11
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多