使用jq替换JSON后传参aws glue create-job报错问题
问题根因
当前脚本报错来自两处核心写法错误:
- 管道流向写反:脚本将
aws glue create-job放在管道左侧,试图把尚未执行的aws命令输出传给jq,但正确逻辑应该是jq先读取本地config.json完成字段替换,再把处理后的JSON传给aws命令。 --cli-input-json未接收到有效参数:参数后直接拼接管道符,等同于没有给该参数传入任何值,因此AWS CLI抛出缺少参数的错误;而jq处理完成的JSON没有被传递给后续命令,就直接输出到了终端。
修复方案
以下两种写法都可以实现需求,推荐优先用第二种,避免命令行长度限制问题。
方案1:命令替换传参
通过$()捕获jq的输出,直接作为--cli-input-json的参数值。注意不要手动拼接jq的引号,用jq自带的--arg参数传入shell变量,可以彻底避免转义bug。
#!/usr/bin/env bash set -e NAME=$1 PROFILE=$2 SCRIPT_LOCATION="s3://bucket/scripts/${NAME}.py" echo "[*]--- Creating new job on AWS" aws glue create-job \ --profile "$PROFILE" \ --name "$NAME" \ --cli-input-json "$(jq --arg scriptloc "$SCRIPT_LOCATION" '.Command.ScriptLocation = $scriptloc' ./resources/config.json)"
方案2:标准输入传参(推荐)
AWS CLI原生支持--cli-input-json接收-作为参数值,代表从标准输入读取JSON内容,此时可以直接把jq的处理结果通过管道传给aws命令,结构更清晰,也不会受命令行参数长度限制:
#!/usr/bin/env bash set -e NAME=$1 PROFILE=$2 SCRIPT_LOCATION="s3://bucket/scripts/${NAME}.py" echo "[*]--- Creating new job on AWS" jq --arg scriptloc "$SCRIPT_LOCATION" '.Command.ScriptLocation = $scriptloc' ./resources/config.json | \ aws glue create-job \ --profile "$PROFILE" \ --name "$NAME" \ --cli-input-json -
注意事项
- 所有shell变量引用都用双引号包裹,避免变量值包含空格、特殊字符时出现解析错误
- 调试时可以先单独执行jq命令,确认输出的JSON结构完全符合Glue Job的配置要求,再接入aws命令执行
- 不要手动嵌套引号拼接jq的赋值语句,
--arg是jq官方推荐的外部变量传入方式,能规避绝大多数转义问题
内容的提问来源于stack exchange,提问作者ohh
相关产品推荐
相关产品推荐

