使用Ternary运算符将数组分配给bash中的另一个变量

时间:2017-02-27 08:30:44

标签: arrays bash ternary-operator

我在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条件来做,但我想用三元运算符

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

因此,在第二种情况下,不要将()置于引号内,而是将另一种方法分配给变量,如

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

作品

发生了什么事
Config=$([ "$env" == "qa" ]] && echo "( ${ConfigA[@]} )" || echo "( ${ConfigB[@]} )")

是echo将数组转换为字符串并在其周围添加(),因此无法正常工作

答案 1 :(得分:0)

没有简单的方法可以在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