bash - 处理可选函数参数

标签 bash aws-cloudformation

尝试创建一个可重用的函数,最多可以使用 4 个参数(尽管解决方案应该是任意的)。我要zip这些带有 AWS CloudFormation 的参数,这样如果我不将位置参数传递给 update_stack,它就不会包含在 CF_ARGS 中。

##
# Update the stack with the given template
# @param: stack_name
# @param: template_body
# @param: [tags]
# @param: [parameters]
##
update_stack() {
    # Handle optional func parameters
    CF_PARAMS=("--stack-name" "--template-body" "--tags" "--parameters")
    # Only include a param if we have a value supplied as an argument. (+1 to ignore script name)
    CF_ARGS=($(for i in "${!CF_PARAMS[@]}"; do j=$(($i+1)); if [ -n "${!j}" ]; then echo "${CF_PARAMS[$i]} ${!j}"; fi; done))

    # Should make the call as "aws cloudformation create-stack --stack-name $1 --template-body $2"
    # If $3 or $4 are not supplied then it should not add them to CFG_ARGS
    aws cloudformation create-stack "${CFG_ARGS[@]}"
}

我认为我的 CF_ARGS 构造已按预期工作,我只是不知道如何 apply bash 函数调用中的参数和我的谷歌技能在如何找到解决方案方面失败了。请帮忙!

谢谢, 亚历克斯

PS。我从 awscli 得到的错误是(也许是双引号?):

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: argument --stack-name is required

编辑(1):

感谢@Barmar 您的第一个解决方案。这让我遇到了这个错误:

Unknown options: Description:, Handles, Authentication, &, Access, permissions, Resources:, ##, #, Policies, ##, PolicyDevelopers:, Type:, AWS::IAM::Policy, Properties:, PolicyName:, Developers-cf, #, @todo:, Remove, suffix, PolicyDocument:, Version:, "2012-10-17", Statement:, -, Effect:, Allow, NotAction:, -, iam:*, -, sts:AssumeRole, ...

“--template-body”参数是一个多行字符串(确切地说是 YAML 文件),是否有双引号每个参数? :/

最佳答案

您将 CF_ARGS 设置为单个字符串,而不是数组。您需要将另一组括号括起来以获取数组。

CF_ARGS=($(for i in "${!CF_PARAMS[@]}"; do j=$(($i+1)); if [ -n "${!j}" ]; then echo "${CF_PARAMS[$i]} ${!j}"; fi; done))

要使其将 for 循环的每一行输出视为单个参数,您可以将 IFS 设置为仅包含换行符:

IFS=$'\n'
CF_ARGS=($(for i in "${!CF_PARAMS[@]}"; do j=$(($i+1)); if [ -n "${!j}" ]; then echo "${CF_PARAMS[$i]} ${!j}"; fi; done))

关于bash - 处理可选函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846439/

相关文章:

linux - Shell 脚本 - 批量循环

amazon-web-services - 现有 key 对不在 AWS Cloudflormation 中

aws-cloudformation - 针对假定角色的 AWS IAM 信任策略

amazon-web-services - 如何在cfn模板的bucketpolicy中指定多个bucket?

linux - 在 Bash 的变量中执行 Perl 脚本

Linux SED - 保留空间 - 所有行的一个值

bash - 相同的文本文件 (.txt) 不匹配

bash - 将与模式匹配的最后一个文件的名称保存到 bash 中的变量

amazon-web-services - AWS 云形成 "API: autoscaling:CreateAutoScalingGroup "

amazon-web-services - CloudFormation - IAM - 带标签的访问控制