我有一个包含 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
您可以将作业放在另一个循环中以减少重复。vN
for
当然,如果您不使用v1
andv2
除了显示一次值之外的任何其他用途,您可以 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]}" )