在while循环bash中通过多个值重复输出循环

在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

我试图在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: 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