如何让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
相关产品推荐
相关产品推荐

