代码之家  ›  专栏  ›  技术社区  ›  Anupam

如何重构shell函数以避免重复代码?

  •  1
  • Anupam  · 技术社区  · 6 年前

    我有两个shell脚本,它们按顺序逐个运行。 所有参数都相同,除了 BUCKETNAME 有没有什么方法可以重构它,使它只在一个命令中运行。 这是我要执行的两个命令。

    命令1

    jsonDumpFL()
    {
      cat <<EOF
    {
       "QUEUEURL":"",
       "BUCKETREGION":"us-east-1",
       "FLAGFILE":"",
       "FTPUSERID":"pcfp-test",
       "FTPPATH":"/PCFP/Incr1",
       "FTPPASSWORD":"pcfp-test",
       "PARAMETERSTOREREGION":"us-east-1",
       "ISFTP2S3":"false",
       "FTPSERVER":"11.11.11.11",
       "BUCKETNAME":"FinancialLineItem/FINALSPARK",
       "QUEUEREGION":"",
       "ISSFTPENABLED":"false",
       "LOCALPATH":"path"
    }
    EOF
    }
    
    aws apigateway test-invoke-method --rest-api-id  int1234udj --resource-id  1asde1 --http-method POST --body "$(jsonDumpFL)"
    

    命令2

    jsonDumpSEG()
    {
      cat <<EOF
    {
       "QUEUEURL":"",
       "BUCKETREGION":"us-east-1",
       "FLAGFILE":"",
       "FTPUSERID":"pcfp-test",
       "FTPPATH":"/PCFP/Incr1",
       "FTPPASSWORD":"pcfp-test",
       "PARAMETERSTOREREGION":"us-east-1",
       "ISFTP2S3":"false",
       "FTPSERVER":"11.11.11.11",
       "BUCKETNAME":"Segments/FINALSPARK",
       "QUEUEREGION":"",
       "ISSFTPENABLED":"false",
       "LOCALPATH":"path"
    }
    EOF
    }
    
    aws apigateway test-invoke-method --rest-api-id  int1234udj --resource-id  1asde1 --http-method POST --body "$(jsonDumpSEG)"
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Inian    6 年前

    只需重新调整函数的因子,得到一个参数,即 BUCKETNAME 并更改函数名以使其动态

    jsonDump()
    {
      cat <<-EOF
    {
       "QUEUEURL":"",
       "BUCKETREGION":"us-east-1",
       "FLAGFILE":"",
       "FTPUSERID":"pcfp-test",
       "FTPPATH":"/PCFP/Incr1",
       "FTPPASSWORD":"pcfp-test",
       "PARAMETERSTOREREGION":"us-east-1",
       "ISFTP2S3":"false",
       "FTPSERVER":"11.11.11.11",
       "BUCKETNAME":"$1",
       "QUEUEREGION":"",
       "ISSFTPENABLED":"false",
       "LOCALPATH":"path"
    }
    EOF
    }
    

    现在把你的函数称为

    "$(jsonDump "FinancialLineItem/FINALSPARK")"
    

    或作为

    "$(jsonDump "Segments/FINALSPARK")"
    
        2
  •  1
  •   chepner    6 年前

    jq 对于创建动态JSON是一个更好的选择,因为它可以确保正确引用参数。

    jsonDump () {
       jq -n --argjson bn "$1" '{
            QUEUEURL: "",
            BUCKETREGION: "us-east-1",
            FLAGFILE: "",
            FTPUSERID: "pcfp-test",
            FTPPATH: "/PCFP/Incr1",
            FTPPASSWORD: "pcfp-test",
            PARAMETERSTOREREGION: "us-east-1",
            ISFTP2S3: "false",
            FTPSERVER: "11.11.11.11",
            BUCKETNAME: $bn,
            QUEUEREGION: "",
            ISSFTPENABLED: "false",
            LOCALPATH: "path"
        }'
    }
    

    (如果对象键周围不包含任何“特殊”字符,还可以将引号放在它们周围。)