打印包含 $ 符号的变量

打印包含 $ 符号的变量

我有一个包含 awscli 的 bash 脚本。我试图打印一个在 for 循环中创建的变量。由于 for 循环,我试图打印的变量包含 $ 符号。我无法打印该值。下面我分享了该脚本。此脚本的输出只是在 for 循环中生成的数字。我想打印在命令中生成的值。

#!/bin/bash

declare -i counter=11
declare -i counter2=14

for i in {1..2}
do
    declare v1$i=$(aws iam get-group --group-name VideoEditors | awk -v counter1=$counter 'NR==counter1' | awk -F\" '{print $4}') 

    counter=$counter+7

    declare v2$i=$(aws iam get-group --group-name VideoEditors | awk -v counter3=$counter2 'NR==counter3' | awk -F\" '{print $4}')

    counter2=$counter2+7
    echo $v1$i
    echo $v2$i
done

答案1

请改用数组,这样您就可以正确索引变量:

#!/bin/bash

declare -ai counters=(11 14)        # indexes start from 0
v1=()
v2=()    

for i in {1..2}; do
    v1[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter1="$counter" 'NR==counter1' | awk -F\" '{print $4}') 
    counters[0]+=7

    v2[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter3="$counter2" 'NR==counter3' | awk -F\" '{print $4}')
    counters[1]+=7

    echo "${v1[$i]}"
    echo "${v2[$i]}"
done

您可以将作业放在另一个循环中以减少重复。vNfor

当然,如果您不使用v1andv2除了显示一次值之外的任何其他用途,您可以 aws ... | awk直接运行并跳过变量和echo.

答案2

我不知道你的代码应该完成什么,但它的作用是:

在第一次迭代中 - 当 i 等于 1 时 - 它声明变量 v11 和 v12 并为它们分配一些内容,然后将 $v1$i 打印到屏幕上。

v1 不存在,$i 是 i 的值,因此您应该在第一个循环中得到“无”并附加 1 作为输出:

然后在第二次迭代中 - 当 i 等于 2 时 - 出于同样的原因,两倍 2 。

您在 awk 等号后所做的操作与结果无关。

建议使用数组并使用 $i 作为数组的索引来解决这个问题。

答案3

您似乎想要输出"命令输出的第 11、17、18 和 21 行上的第四个 - 分隔字段aws

aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }'

这将调用aws一次而不是四次,并调用awk一次而不是八次。

如果你想把它放在一个数组中:

readarray -t output < <(
aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }' )

该数组output现在将包含每个元素中一行的数据awk,从索引 0 开始。

如果你想将该数组分成两部分,这样你就可以在一个数组中获得元素 0 和 2,在另一个数组中获得元素 1 和 3:

v1=( "${output[0]}" "${output[2]}" )
v2=( "${output[1]}" "${output[3]}" )

相关内容