我在bash脚本中使用break还是Continue?

时间:2018-10-10 20:16:41

标签: bash

我有一个bash脚本来收集有关我们AWS用户的信息。它列出了用户名,他所在的帐户(具有帐号),他所属的组以及他有权访问的角色(如果有)。

我使用4个级别的while循环来实现此目的。

我在一个AWS账户中获取了他所属的一系列用户组以及该AWS账户中的所有角色(您必须做一些体操运动才能解析出我基本上已经确定的角色内容)。 / p>

但是,如果数组的成员为空(或null),我希望它继续读取组名的外部角色。

我这样构建数组:

readarray aws_groups < <(aws iam list-groups-for-user --user-name "$aws_user_name" --profile="$aws_key" | jq -r '.Groups[].GroupName')
readarray aws_roles < <(aws iam list-roles --profile="$aws_key" | jq -r '.Roles[].RoleName')

我的问题是,如果我使用“ break”,我是否只会跳出具有以下信息的if / then语句:

 if [[ -n "$aws_group" ]]; then
             echo "Null group."
             echo "*****BREAK HERE******"
             break
   fi

或者,当我使用break时,我跳出了它所属的循环,循环遍历aws_group值:

while IFS= read -r aws_group
        do
          if [[ -n "$aws_group" ]]; then
             echo "Null group."
             echo "*****BREAK HERE******"
             break
          fi

这里我的代码足够多,希望有助于显示我用来循环显示aws用户名,aws帐户和帐号,aws组和aws角色的结构:

while IFS= read -r aws_user_name
  do
    echo "*************************************************************************"
    echo "*        Search for AWS User: $aws_user_name in All KPMG Accounts       *"
    echo "*************************************************************************"
    echo
    while IFS= read -r aws_key && read -ru 3 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 [[ -n "$user_lives_here" ]]; then
        readarray aws_groups < <(aws iam list-groups-for-user --user-name "$aws_user_name" --profile="$aws_key" | jq -r '.Groups[].GroupName')
        readarray aws_roles < <(aws iam list-roles --profile="$aws_key" | jq -r '.Roles[].RoleName')
        while IFS= read -r aws_group
        do
          if [[ -n "$aws_group" ]]; then
             echo "Null group."
             echo "*****BREAK HERE******"
             break
          fi
          while IFS= read -r aws_role
          do
             if [[ -z "$aws_role" ]]; then
             echo "Null role."
             echo "*****BREAK HERE******"
             break
          fi
          echo "Debug statement"
          echo "***********************************************************************************************************************************************"
          printf "This is the role name: %s\\nThis is the user name: %s\\nThis is the group: %s\\nand this is the account: %s\\n*"  "$aws_role" "$aws_user_name" "$aws_user_group" "$aws_key"
          echo "***********************************************************************************************************************************************"
          **** some more code ****
         done  <<< "${aws_roles[@]}"
    done <<< "${aws_groups[@]}"
   done < "$aws_env_list"  3< "$aws_account_numbers"
 done < "$aws_users_all"

在这里,您将看到调试代码,因为我正在构建脚本。

如果您能弄清楚中断是什么,并且最好在这里继续使用,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

breakcontinue仅在循环上运行,而不在if上运行。 documentation中对此有清楚的解释:

  

break [n]
      从forwhileuntilselect循环中退出。如果指定了n,则中断n级别。

     

continue [n]
      恢复封闭的forwhileuntilselect循环的下一个迭代。如果指定了n,请从第n开始                 封闭循环。