根据输出从单个命令设置多个数组类型的变量



我为这个标题道歉,我不知道如何描述我试图做的事情,所以我将通过代码进行解释。

read a b <<<$(`ec2-describe-instances --region $REGION | awk '/SECURITY_ROLE/ { print $2 "n" $5 }'`)

不幸的是,这并不是我需要做的全部。从那以后,我需要将两个数组叠加到一个关联数组中。

我可能会使用循环来完成此操作。但主要问题是上面的命令。

使用read a b <<<$(command)不会设置数组。在输出为CCD_ 2的情况下,最终结果如下:

# echo ${a[0]}
a
# echo ${a[1]}
# echo ${b[0]}
1 b 2
# echo ${b[1]}
#

正如您所看到的,如果内容大于变量的数量,它不会通过添加到数组中的变量进行循环(尽管它与数组无关)。

如果我使用readarray命令,我仍然没有收到所需的输出。

我想要的输出是…(其中c是由a和b创建的关联数组)

# for i in `echo ${a[*]}` ; do echo ${c[$i]} ; done
1
2

换句话说,在我正在创建的脚本中,我需要能够使用awk中的$2值从awk中调用$5值,而无需多次运行ec2-describe-instances命令(这需要很长时间)。

编辑

我找不到理想的解决方案。。。我确信它在某个地方,但经过大约两天的搜索,我最终在a.Danischewski的启发下完成了一项肮脏的工作。

readarray HA_NODE_DIRECTORY < <(ec2-describe-instances --region $REGION | 
awk '/HA_Monitor/ { print $2, $5 }')
readarray HA_NODE_LIST < <(OIFS=$IFS
IFS=$'n'
for i in ${HA_NODE_DIRECTORY[@]}
do 
echo $i | awk '{ print $1 }'
done
IFS=$OIFS)

使用另一个脏函数将它们联系在一起,而不是使用干净的字典/关联数组

function find_hostname {
ID=$1
OIFS=$IFS
IFS=$'n'
for i in ${HA_NODE_DIRECTORY[@]}
do 
echo $i | awk -v x=$ID '$0 ~ x { print $2 }'
done
IFS=$OIFS
}

我不确定ec2-describe-instances --region $REGION | awk '/SECURITY_ROLE/ { print $2 "n" $5 }'输出了什么,但看起来您希望结果在数组中。

您可以使用read -a设置数组:
read -d'n' -a a < <(printf "Field1 Field2_%sn" {1..10})

$ echo ${a[2]}
Field1
$ echo ${a[3]}
Field2_2

对于两个阵列:

unset a b && tmpfile="/tmp/_arr2tmp_$$_" 
printf "Field1 Field2_%sn" {1..10} > "${tmpfile}"
read -d'n' -a a < <(awk '{print $1}' "${tmpfile}")
read -d'n' -a b < <(awk '{print $2}' "${tmpfile}")
echo "First three values of a: ${a[1]},${a[2]},${a[3]}"
echo "First three values of b: ${b[1]},${b[2]},${b[3]}"
rm "${tmpfile}"

相关内容

  • 没有找到相关文章

最新更新