Bash脚本中拼接含Token的URL传递给curl异常问题解决
解决Bash脚本中拼接URL后curl返回Pending状态的问题
我之前碰到过类似的情况,这种脚本内请求异常但CLI执行正常的问题,大多是变量处理或命令写法的隐性问题,下面是几个关键的排查和修复点:
1. 清理Token中的隐藏字符
从jq获取的myToken可能带有换行符或不可见空白字符(比如回车),这会让拼接后的URL包含无效字符,导致服务器无法正确识别请求。可以在获取Token时增加清理步骤:
# 移除可能存在的换行/回车符,确保Token是纯字符串 myToken=$(echo "${myAccessJSON}" | jq -r '.token' | tr -d '\n\r')
虽然jq -r已经是raw输出,但如果原始JSON的token字段本身带隐藏字符,或者管道传递中引入了换行,这一步能彻底清理干净。
2. 正确拼接URL(用引号包裹变量)
脚本里的URL拼接方式容易出现隐性问题,建议用双引号包裹变量,避免shell解析时的意外:
baseUrl="https://api.site.com/api/v2/export/" # 用双引号包裹变量,确保拼接时不会出现空格或特殊字符解析错误 myUrl="${baseUrl}${myToken}"
可以在拼接后加一行调试输出,确认URL是否正确:
echo "调试:拼接后的URL为 '${myUrl}'"
如果输出里URL带有换行或者空格,那就是Token清理环节的问题。
3. 修复curl命令的写法
你原来的curl命令里反斜杠后面加了空格,这会导致shell把\ --header当成错误的参数(反斜杠转义了后面的空格,使得--header前多了一个无效空格),正确的写法是反斜杠后面直接换行,不要加空格:
awsAccess=$(curl -X GET "${myUrl}" \ --header "Accept: application/json" \ --header "Authorization: Bearer myAuthCode")
同时,${myUrl}一定要用双引号包裹,防止URL中出现特殊字符(比如参数里的&、?)被shell拆分。
4. 额外验证点
如果上面的步骤还没解决问题,可以在脚本里直接把拼接后的URL赋值成硬编码形式测试:
myUrl="https://api.site.com/api/v2/export/123456"
如果这样请求正常,那还是Token的获取或拼接环节有问题;如果还是返回Pending,那可能是脚本执行环境和CLI环境有差异(比如环境变量、权限),但这种情况比较少见。
内容的提问来源于stack exchange,提问作者gaspero1
相关产品推荐
相关产品推荐

