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

Shell脚本数组元素在JSON PUT请求中失效,直接传URL正常

问题描述

我有一个URL数组,想要遍历数组中的每个元素执行PUT请求,但数组元素无法正常生效,直接使用URL值时却能正常运行。相关代码、输出及可正常运行的代码示例如下:

问题代码

# 打印不匹配的URL
echo "Uncommon URLs:"
printf "%s\n" "${uncommon_urls[@]}"


IFS=$'\n' read -d '' -r -a array1 <<< "${uncommon_urls[@]}"
getApp=$(curl -X GET -H "$headers" -H "Content-Type: application/json" "$uri")
#echo $getApp
for url in "${array1[@]}"; do
        echo $url
        url=$(echo "$url" | rev | cut -c2- | rev)
        echo $url
        url=$(echo "$url" | tr -d '"')
        echo $url
       #getApp=$(echo "$getApp" | jq '.redirect_uris -= ["https://172.16.19.31:1111/login/callback"]')
       getApp=$(echo "$getApp" | jq '.redirect_uris -= ["'$url'"]')
       getAppnew=$(curl -X PUT -H "$headers" -H "Content-Type: application/json" -d "$getApp" "$uri")
done

echo urslnew
echo $getAppnew

输出

Uncommon URLs:
[
  "https://172.xx.xx.31:3610/login/callback",
  "https://172.xx.xx.31:3611/login/callback"
  
]

"https://172.xx.xx.31:3611/login/callback",
"https://172.xx.xx.31:3611/login/callback"
https://172.xx.xx.31:3611/login/callback
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3411    0  1597  100  1814   2321   2636 --:--:-- --:--:-- --:--:--  4950
"https://172.xx.xx.31:3612/login/callback",
"https://172.xx.xx.31:3612/login/callback"
https://172.xx.xx.31:3612/login/callback
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3411    0  1597  100  1814   3013   3422 --:--:-- --:--:-- --:--:--  6423

可正常运行的代码

getApp=$(echo "$getApp" | jq '.redirect_uris -= ["https://172.xx.xx.31:1111/login/callback"]')

手动定义数组可正常运行的示例

uncommon_urls=(
  "https://172.16.19.31:12163/login/callback"
  "https://172.16.19.31:20383/login/callback"
  "https://172.16.19.31:31990/login/callback"
  "https://172.16.19.31:21480/login/callback"
  "https://172.16.19.31:2851/login/callback"
  "https://172.16.19.31:8549/login/callback"
  "https://172.16.19.31:11092/login/callback"
  "https://172.16.19.31:11092/auth/login/callback"
  "https://172.16.19.31:3355/auth/login/callback"
  "https://172.16.19.31:10602/auth/login/callback"
)
解决方案

问题核心是原uncommon_urls是JSON数组格式的字符串,不是标准bash数组,手动用IFS拆分时会把换行、括号、逗号等符号混入数组元素,导致后续处理后的URL残留无效字符,传给jq时无法匹配目标值。

修复代码

# 把JSON数组字符串解析为纯净的bash数组
readarray -t uncommon_urls < <(echo "$uncommon_urls" | jq -r '.[]')

getApp=$(curl -X GET -H "$headers" -H "Content-Type: application/json" "$uri")

for url in "${uncommon_urls[@]}"; do
    echo "处理URL: $url"
    # 用jq的--arg参数传递变量,避免字符串拼接的引号/特殊字符问题
    getApp=$(echo "$getApp" | jq --arg url "$url" '.redirect_uris -= [$url]')
    getAppnew=$(curl -X PUT -H "$headers" -H "Content-Type: application/json" -d "$getApp" "$uri")
done

echo "最终结果: $getAppnew"

关键改进点

  1. 用jq -r '.[]'直接提取JSON数组中的每个URL,自动过滤掉引号、逗号等格式符号,生成纯净的bash数组
  2. 用jq --arg传递URL变量,替代手动字符串拼接,避免URL含特殊字符时的语法错误
  3. 移除冗余的字符串处理步骤(rev、cut、tr),减少出错环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 13:47:03