如何通过单次请求将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
相关产品推荐
相关产品推荐

