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

blu*_*ndr 1 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: 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
Run Code Online (Sandbox Code Playgroud)

这些是我试图读取的文件:

aws_users_all="source_files/aws_users_all.txt"
Run Code Online (Sandbox Code Playgroud)

示例输出:

aadatiya
abigailcharles 
tdunphy
broberts
Run Code Online (Sandbox Code Playgroud)

下一个文件:

aws_env_list="source_files/aws_environments_all.txt"
Run Code Online (Sandbox Code Playgroud)

示例输出:

company-lab
company-stage
company-nonprod
company-prod
Run Code Online (Sandbox Code Playgroud)

最后一个文件:aws_account_numbers="source_files/aws_account_numbers.txt" 示例输出:

  123456789191
  987654321211
  456721231213
  123213512321
Run Code Online (Sandbox Code Playgroud)

这是循环不正确的代码:

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"
Run Code Online (Sandbox Code Playgroud)

如果我取出一个级别(帐号级别),脚本将按预期运行并生成以下输出:

AWS user name: aadatiya does not exist in AWS account: company-lab
AWS user name: aadatiya does not exist in AWS account: company-bill
AWS user name: aadatiya does not exist in AWS account: company-stage
AWS user name: aadatiya does not exist in AWS account: company-dlab
AWS user name: aadatiya does not exist in AWS account: company-nonprod
AWS user name: aadatiya does not exist in AWS account: company-prod
AWS user name: aadatiya does not exist in AWS account: company-govcloud-admin-nonprod
AWS user name: abigailcharles does not exist in AWS account: company-lab
AWS user name: abigailcharles does not exist in AWS account: company-bill
AWS user name: abigailcharles does not exist in AWS account: company-stage
AWS user name: abigailcharles does not exist in AWS account: company-dlab
AWS user name: abigailcharles does not exist in AWS account: company-nonprod
AWS user name: abigailcharles does not exist in AWS account: company-prod
AWS user name: abigailcharles does not exist in AWS account: company-govcloud-admin-nonprod
Run Code Online (Sandbox Code Playgroud)

我刚刚注释掉了这个级别并且它有效:

  #while IFS= read -r aws_account_num
  #do
  #done
Run Code Online (Sandbox Code Playgroud)

如何正确执行此操作,以便循环遍历每个名​​称、aws 账户和 aws 账号,以便每个条目显示一次?

che*_*ner 5

您希望一个循环使用三个不同的文件描述符调用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"
Run Code Online (Sandbox Code Playgroud)