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

如何让curl/jq在bash脚本中将含空格字符串视为单个字符串?

解决带空格字符串在bash、jq、curl中的传递问题

1. 正确定义auth变量

避免嵌套引号混乱,推荐两种可靠方式:

# 方式1:单引号包裹整体,内部单引号用'\''转义
auth='Authorization: Bearer {{@CmdCache | curl -s -d '\''{"username":"jackie@xxxx.com","password":"Welcome123"}'\'' -H "Content-Type: application/json" -H "Accept: application/json" -X POST "https://dev.qtech.ai/login" | jq --raw-output ".token"}}'

# 方式2:Here String(更直观,适合复杂字符串)
auth=$(cat <<'EOF'
Authorization: Bearer {{@CmdCache | curl -s -d '{"username":"jackie@xxxx.com","password":"Welcome123"}' -H "Content-Type: application/json" -H "Accept: application/json" -X POST "https://dev.qtech.ai/login" | jq --raw-output ".token"}}
EOF
)

这里用<<'EOF'的单引号Here Document,Shell会原样读取字符串,完美保留空格和特殊字符,无需手动转义内部引号。

2. 用jq的--arg参数传递变量更新JSON

不要直接将变量插入jq脚本,而是通过--arg把Bash变量传给jq,让jq将其当作纯字符串处理,避免Shell解析特殊字符:

# --arg newHeader "$auth":把Bash的auth变量赋值给jq内部的$newHeader变量
mAuth=$(echo "$authArray" | jq --arg newHeader "$auth" 'map(select(.name == "testtoken1") |= (.header_1 = $newHeader))' | jq -c .)

3. 生成udto并执行curl请求

生成udto和调用curl时,必须用双引号包裹变量,避免Shell按空格拆分内容:

# 用双引号包裹$mAuth,确保JSON数组作为整体解析
udto=$(_jq '.' | jq ".auths = $mAuth")

# curl请求中,-d参数的$udto用双引号包裹,保证JSON完整传递
curl -s --location --request PUT "${HOST}/api/v1/projects/${PROJECT_ID}/env/${eId}" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer ${token}" \
  -d "$udto"

核心注意事项

  • 所有含空格/特殊字符的变量,在Shell中使用时必须用双引号包裹,防止被拆分
  • jq处理外部字符串时,优先用--arg(普通字符串)或--argjson(JSON格式)传递,不要直接拼接脚本
  • 复杂字符串优先用单引号或Here Document定义,避免引号转义错误

内容的提问来源于stack exchange,提问作者devops-admin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:05:14