【问题标题】:Using Ternary operator to assign an array to another variable in bash使用三元运算符将数组分配给bash中的另一个变量
【发布时间】:2017-07-17 18:49:15
【问题描述】:

我在 bash 脚本中有两个数组 说

ConfigA=("hostname1" "hostname2")
ConfigB=("hostname3" "hostname4")

现在我将一个参数传递给脚本,指定我需要使用哪个数组

为此,我想出了一个 bash 等效的三元运算符,如下所示

int a = (b == 5) ? c : d;

equilvalent in bash

a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

我尝试在我的情况下使用它,如下所示

env=$1
Config=$([ "$env" == "qa" ]] && echo "${ConfigA[@]}" || echo "${ConfigB[@]}")

但是在上述情况下,我得到了输出

hostname1 hostname2

但它不是一个数组,因为当我尝试循环它时,它会同时打印两个。

我也尝试过将数组包围在() 之内

Config=$([ "$env" == "qa" ]] && echo "( ${ConfigA[@]} )" || echo "( ${ConfigB[@]} )")

但这也无济于事。

如何使用三元运算符将数组分配给新变量?

我知道我可以使用 if-else 条件来做到这一点,但我想使用三元运算符来做到这一点

感谢您的帮助

【问题讨论】:

    标签: arrays bash ternary-operator


    【解决方案1】:

    没有简单的方法可以将数组从一个变量复制到bash 中的另一个变量。

    根据Bash: How to assign an associative array to another variable name (e.g. rename the variable)?,您可以使用以下解决方法:

    [[ "$env" == "qa" ]] && eval $(declare -p ConfigA | sed 's/ConfigA/Config/') || eval $(declare -p ConfigB | sed 's/ConfigB/Config/')
    echo ${Config[*]}
    hostname3 hostname4
    

    【讨论】:

    • 如果源数组的名称作为元素或其子字符串包含在其中,例如x=(x y z)a=(abc def)
    • @Leon 在这种情况下最好是循环遍历数组的所有元素,正如我提到的链接中所建议的那样
    【解决方案2】:

    因此,不是在第二种情况下将() 放在引号内,而是将数组分配给像

    这样的变量的另一种方法
    [ "$env" == "qa" ]] && Config=( "${ConfigA[@]}" ) || Config( "${ConfigB[@]}" )
    

    作品

    发生了什么

    Config=$([ "$env" == "qa" ]] && echo "( ${ConfigA[@]} )" || echo "( ${ConfigB[@]} )")
    

    是 echo 将数组转换为字符串并在其周围附加了(),因此它不起作用

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 2013-06-15
      • 2015-09-12
      • 2021-11-16
      • 1970-01-01
      • 2016-11-07
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多