我有一个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"
在这里,您将看到调试代码,因为我正在构建脚本。
如果您能弄清楚中断是什么,并且最好在这里继续使用,我将不胜感激。
答案 0 :(得分:1)
break
和continue
仅在循环上运行,而不在if
上运行。 documentation中对此有清楚的解释:
break [n]
从for
,while
,until
或select
循环中退出。如果指定了n
,则中断n
级别。
continue [n]
恢复封闭的for
,while
,until
或select
循环的下一个迭代。如果指定了n
,请从第n
开始 封闭循环。