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

如何通过单次请求将jq返回的两个元素存入Shell变量

单次Curl请求同时为多个Shell变量赋值

问题场景

原有代码通过两次Curl请求分别获取接口返回的.isAutomated和.name字段,存入boolStatus、name变量,希望优化为单次请求完成两个变量的赋值。原有代码:

boolStatus=$(curl -X 'GET' \
  "https://tsit-app1/api/v2/workItems/$case?versionNumber=0" \
  -H 'accept: application/json' \
  -H "Authorization: $apiKey" | jq '.isAutomated')
echo $boolStatus

name=$(curl -X 'GET' \
  "https://tsit-app1/api/v2/workItems/$case?versionNumber=0" \
  -H 'accept: application/json' \
  -H "Authorization: $apiKey" | jq '.name')
echo $name

尝试用jq输出赋值语句时,得到带引号的结果,无法直接赋值:

curl -X 'GET' \
  "https://tsit-app1/api/v2/workItems/$case?versionNumber=0" \
  -H 'accept: application/json' \
  -H "Authorization: $apiKey" | jq '"boolStatus=\(.isAutomated)", "name=\(.name)"'

输出:

"boolStatus=true", 
"name=bla bla"

解决方案

方法1:用jq -r生成无引号赋值语句,通过eval执行

eval "$(curl -X 'GET' \
  "https://tsit-app1/api/v2/workItems/$case?versionNumber=0" \
  -H 'accept: application/json' \
  -H "Authorization: $apiKey" | jq -r '
    "boolStatus=\(.isAutomated)",
    "name=\(.name)"
  ')"
  • -r参数让jq输出原始字符串(去除默认的引号包裹)
  • 生成的两行赋值语句通过eval直接执行,完成变量赋值

验证:

echo $boolStatus  # 输出true或false
echo $name        # 输出接口返回的name字段内容

方法2:用read读取jq输出的字段值(适合无特殊字符场景)

如果name字段不包含空格或特殊字符,也可以用read直接读取:

read -r boolStatus name < <(curl -X 'GET' \
  "https://tsit-app1/api/v2/workItems/$case?versionNumber=0" \
  -H 'accept: application/json' \
  -H "Authorization: $apiKey" | jq -r '\(.isAutomated) \(.name)')
  • jq将两个字段用空格分隔输出,read读取后分别存入对应变量
  • 若name包含空格,此方法会导致内容被拆分,建议优先使用方法1

注意事项

  • 若接口返回内容可能包含恶意Shell字符,使用eval需谨慎,确保数据安全
  • 方法1能完整保留name字段的原始内容(包括空格、特殊字符)

内容的提问来源于stack exchange,提问作者Yaroslav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:41:42