使用大括号扩展将扩展数组存储在变量中

使用大括号扩展将扩展数组存储在变量中

我想存储node1 node2 node3在一个变量中,以便它可以用作其他脚本的输入。

但是,我想通过使用 bash 给出的大括号扩展来做到这一点,如下所示:node{1..3}

我尝试使用一个变量nodes=node{1..3},但是当我将它用作脚本的参数 ( $nodes) 时,它会按字面意思拾取并且不会扩展。

答案1

要分配给数组,请将元素放在括号中:

nodes=(node{1..3})

使用数组时,您需要明确告诉 bash 您要将其扩展为数组。

mycommand "${nodes[@]}"

由于 ksh 和 bash 中数组的设计怪癖,$node是数组的第一个元素,您需要显式询问具有索引的所有元素[@]。一如既往,你需要变量扩展周围用双引号引起来;使用 时[@],每个元素都被放入一个单独的单词中。

请参阅bash手册了解更多信息。

node=node{1..3}不起作用,因为大括号扩展仅发生在允许多个单词的上下文中。对标量(字符串)变量的赋值仅允许单个单词。在扩展变量时,您也只会得到一个单词,因为 Bash 在变量扩展之前进行大括号扩展。

答案2

供专家用户考虑:

$ mapfile -t arr < <(printf "%s\n" node{1..3})
$ printf "%s\n" "${arr[@]}"
node1
node2
node3

来源

答案3

看了这个问题后找到了答案:$array 不在 ksh 和 bash 中扩展整个数组的理由是什么?

nodes=$(echo nodes{1..3})

相关内容