在while循环bash中通过多个值重复输出循环
我试图在bash中使用while循环遍历3个文件的内容。它们包含名称、aws帐户和aws帐户编号的列表 但是循环不正确,它不断重复列表中的第一个名称和列表中的第一个aws环境 这是我看到的输出:在while循环bash中通过多个值重复输出循环,bash,Bash,我试图在bash中使用while循环遍历3个文件的内容。它们包含名称、aws帐户和aws帐户编号的列表 但是循环不正确,它不断重复列表中的第一个名称和列表中的第一个aws环境 这是我看到的输出: AWS user name: aadatiya does not exist in AWS account: company-lab AWS user name: aadatiya does not exist in AWS account: company-lab AWS user name: aad
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-lab
以下是我试图读取的文件:
aws_users_all="source_files/aws_users_all.txt"
样本输出:
aadatiya
abigailcharles
tdunphy
broberts
下一个文件:
aws_env_list="source_files/aws_environments_all.txt"
样本输出:
company-lab
company-stage
company-nonprod
company-prod
123456789191
987654321211
456721231213
123213512321
最后一个文件:
aws\u account\u numbers=“source\u files/aws\u account\u numbers.txt”
样本输出:
company-lab
company-stage
company-nonprod
company-prod
123456789191
987654321211
456721231213
123213512321
这是循环不正确的代码:
ofile=source_files/aws_access_keys/company-aws-access-keys-all-accounts.csv
while IFS= read -r aws_user_name
do
while IFS= read -r aws_key
do
while IFS= read -r aws_account_num
do
user_lives_here=$(aws iam get-user --user-name "$aws_user_name" --profile="$aws_key" 2> /dev/null | jq -r '.User.UserName')
if [[ -z "$user_lives_here" ]]; then
printf "AWS user name: %s does not exist in AWS account: %s\\n(%s)" "$aws_user_name" "$aws_key" "$aws_account_num"
else
echo "$aws_user_name,$user_access_key1,$key1_date_created,$key1_last_used,$key1AgeDays,$aws_key,$aws_account_num" >> $ofile
fi
done < "$aws_account_numbers"
done < "$aws_env_list"
done < "$aws_users_all"
我刚刚注释了这个级别,它可以工作:
#while IFS= read -r aws_account_num
#do
#done
如何正确地执行此操作,以便循环遍历每个名称、aws帐户和aws帐户编号,以便每个条目显示一次 您需要一个循环,使用三个不同的文件描述符调用读取三次
while IFS= read -r aws_user_name
IFS= read -r aws_key <&3
IFS= read -r aws_account_num <&4; do
...
done < "$aws_users_all" 3< "$aws_env_list" 4< "$aws_account_numbers"
当IFS=read-r aws\u用户名
IFS=read-r aws_key您需要一个循环,使用三个不同的文件描述符调用read
三次
while IFS= read -r aws_user_name
IFS= read -r aws_key <&3
IFS= read -r aws_account_num <&4; do
...
done < "$aws_users_all" 3< "$aws_env_list" 4< "$aws_account_numbers"
当IFS=read-r aws\u用户名
如果s=read-r aws_键有一种使用paste
命令的方法:
注:当每个文件逐行包含1个单词时,这将很简单
。。。如果计划在源文件中使用空格,则可以使用另一个分隔符:
而IFS=@read-r aws\u user\u name aws\u key aws\u account\u num;做
printf“用户:%-16s密钥:%-22s帐户:%s\n”\
$aws\U用户名“$aws\U密钥”$aws\U帐户编号
# ....
完成<有一种方法可以使用粘贴命令:
注:当每个文件逐行包含1个单词时,这将很简单
。。。如果计划在源文件中使用空格,则可以使用另一个分隔符:
而IFS=@read-r aws\u user\u name aws\u key aws\u account\u num;做
printf“用户:%-16s密钥:%-22s帐户:%s\n”\
$aws\U用户名“$aws\U密钥”$aws\U帐户编号
# ....
完成<一种方法是在处理之前将所有输入数据加载到数组中:
IFS= mapfile -t aws_users <"$aws_users_all"
IFS= mapfile -t aws_envs <"$aws_env_list"
IFS= mapfile -t aws_acct_nums <"$aws_account_numbers"
for aws_user_name in "${aws_users[@]}" ; do
for idx in ${!aws_envs[*]} ; do
aws_key=${aws_envs[idx]}
aws_account_num=${aws_acct_nums[idx]}
# Code using $aws_user_name, $aws_key, and $aws_account_num
...
done
done
IFS=mapfile-t aws_users一种方法是在处理之前将所有输入数据加载到数组中:
IFS= mapfile -t aws_users <"$aws_users_all"
IFS= mapfile -t aws_envs <"$aws_env_list"
IFS= mapfile -t aws_acct_nums <"$aws_account_numbers"
for aws_user_name in "${aws_users[@]}" ; do
for idx in ${!aws_envs[*]} ; do
aws_key=${aws_envs[idx]}
aws_account_num=${aws_acct_nums[idx]}
# Code using $aws_user_name, $aws_key, and $aws_account_num
...
done
done
IFS=mapfile-t aws\u用户可以添加预期的示例输出和所有“aws-*”文件的示例内容吗?如果脚本运行正常。对于每个用户名,检查每个键。在这个范围内,对于每个键,您检查每个帐号。我假设你想检查的是每个用户名只有一次对应的密钥和帐号,对吗?谢谢大家。我已经用我想要的样本输出更新了OP,并且更清楚地解释了我要做的事情。你能添加样本输入吗?这些文件相关吗?aws_用户名、aws_密钥和aws_帐号是否相关?在这种情况下,可以使用单个循环,而不是现有的嵌套循环。请参阅本文,了解如何一次读取三个文件:。是否可以添加预期的示例输出以及所有“aws-*”文件的示例内容?好的,您的脚本运行正常。对于每个用户名,检查每个键。在这个范围内,对于每个键,您检查每个帐号。我假设你想检查的是每个用户名只有一次对应的密钥和帐号,对吗?谢谢大家。我已经用我想要的样本输出更新了OP,并且更清楚地解释了我要做的事情。你能添加样本输入吗?这些文件相关吗?aws_用户名、aws_密钥和aws_帐号是否相关?在这种情况下,可以使用单个循环,而不是现有的嵌套循环。请参阅本文,了解如何一次读取三个文件:。谢谢!这确实让我更亲近了。但是,它应该循环遍历每个用户名,然后遍历所有帐户及其帐号。现在发生的是将一个名称与一个帐户进行比较,然后将下一个用户名与下一个帐户进行比较。在继续下一个aws帐户之前,需要将一个用户帐户与所有aws帐户进行比较<代码>AWS用户名:aadatiya不存在于AWS帐户中:公司实验室AWS用户名:abigailcharles不存在于AWS帐户中:公司账单AWS用户名:ab jenkin不存在于AWS帐户中:公司阶段AWS用户名:ab rrf开发pyservice不存在于AWS帐户中:公司dlab AWS用户名:管理员不存在于AWS帐户中帐户:company nonprod AWS用户名:adravid在AWS帐户中不存在:company prod AWS用户名:aelahi在AWS帐户中不存在:company govcloud admin nonprod
您可以在每个读取之间使用&
,以确保在文件的第一端停止循环。@bluethundr然后您需要一种混合方法;从一个文件读取的外部循环和从两个文件读取的内部循环(或类似的东西)。。。。您可以编写read-ru3 aws_key
而不是read-r aws_key谢谢!这确实让我更亲近了。但是,它应该循环遍历每个用户名,然后遍历所有帐户及其帐号。现在发生的是将一个名称与一个帐户进行比较,然后将下一个用户名与下一个帐户进行比较。在继续下一个aws帐户之前,需要将一个用户帐户与所有aws帐户进行比较<代码>AWS用户名:aadatiya不存在于AWS帐户中:公司实验室AWS用户名:abigailcharles不存在于AWS帐户中:公司账单AWS用户名:ab jenkin不存在于AWS帐户中:公司阶段AWS用户名:ab rrf开发pyservice不存在于AWS帐户中:公司dlab AWS用户名:管理员不存在于AWS帐户中帐户:公司nonprod AWS用户名:adravid在AWS帐户中不存在:公司prod AWS用户名:aelahi在AWS帐户中不存在:公司govcloud admin nonprod
您可以在每个读取之间使用&
,以确保
IFS= mapfile -t aws_users <"$aws_users_all"
IFS= mapfile -t aws_envs <"$aws_env_list"
IFS= mapfile -t aws_acct_nums <"$aws_account_numbers"
for aws_user_name in "${aws_users[@]}" ; do
for idx in ${!aws_envs[*]} ; do
aws_key=${aws_envs[idx]}
aws_account_num=${aws_acct_nums[idx]}
# Code using $aws_user_name, $aws_key, and $aws_account_num
...
done
done