You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:24:24