我为这个标题道歉,我不知道如何描述我试图做的事情,所以我将通过代码进行解释。
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}"