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"
关键改进点
- 用
jq -r '.[]'直接提取JSON数组中的每个URL,自动过滤掉引号、逗号等格式符号,生成纯净的bash数组 - 用
jq --arg传递URL变量,替代手动字符串拼接,避免URL含特殊字符时的语法错误 - 移除冗余的字符串处理步骤(rev、cut、tr),减少出错环节
内容的提问来源于stack exchange,提问作者Ashish Mishra
相关产品推荐
相关产品推荐

