2017-03-16 5 views
0

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[@]}" 
} 

は、私は、このための解決策を見つける方法に失敗した私は、どれだけのapply、bashの関数呼び出しの引数と私のGoogleのスキルを知らない建設が期待どおりに動作しCF_ARGSを持っていると思います。助けてください!

おかげで、 アレックス

PS。

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 

EDIT(1):

おかげ@Barmarあなたの最初の解決のために、私はawscliから取得しましたエラーが(?多分二重引用符)です。つまり、このエラーに私を得た:「--template-体」引数が(YAMLファイルは正確には)複数行の文字列である

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, ... 

、とにかく二重引用符各引数にありますか? :/

答えて

1

CF_ARGSを配列ではなく1つの文字列に設定しています。配列を取得するには、そのまわりに別の括弧をラップする必要があります。

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

ファンタスティック:あなたがIFSを設定することができます

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

そして、それは1つの引数としてforループからの出力の各行を扱うようにするには、唯一の改行が含まれています!ありがとう、私は別の問題にもかかわらずヒットしました。私はフォローアップ、任意の提案と元の質問を更新しましたか? –

+0

@AlexLatchford私はその答えを更新しました。 – Barmar

+0

私は 'IFS = $";を使用しなくてはなりませんでした。まだ完全には動作していませんが、次のビットの新しい質問を開きます:) –

関連する問題