脚本中用bash变量token调用curl返回无效数据,手动执行正常如何解决?
问题描述
用户执行以下bash脚本时,虽然echo输出的token显示正确,但通过curl请求返回的data无效;但手动将token写入curl命令却能获取正确数据:
bash get-token.sh | grep x-subject-token | awk '{print $2}' >> token.txt token=`cat token.txt` echo $token this is true data=`curl -s -H "X-Auth-Token: ${token}" -X GET "https://url"` echo $token = correct token but $data is invalid.
问题原因
核心问题大概率是token中包含不可见控制字符(比如换行符、多余空格):
- 通过
>> token.txt写入文件时,会额外添加换行符;后续cat token.txt读取时会把这个换行符也带入token变量 grep或awk的输出可能附带了不可见字符,echo输出时会自动忽略,但curl请求时会把这些字符作为token的一部分发送,导致认证失败
解决方案
1. 直接赋值token,跳过文件中转(推荐)
去掉文件写入和读取的步骤,直接将token结果赋值给变量,避免中间步骤引入的多余字符:
token=$(bash get-token.sh | grep x-subject-token | awk '{print $2}') echo "$token" this is true data=$(curl -s -H "X-Auth-Token: ${token}" -X GET "https://url") echo "$token = correct token, data: $data"
2. 清理token中的不可见字符
如果必须保留文件中转的方式,读取token时清理掉换行符和多余空格:
bash get-token.sh | grep x-subject-token | awk '{print $2}' > token.txt # 用>而不是>>避免重复写入旧token # 方式1:用xargs去除多余空格和换行 token=$(xargs < token.txt) # 方式2:用tr删除换行符 token=$(tr -d '\n' < token.txt) echo "$token" this is true data=$(curl -s -H "X-Auth-Token: ${token}" -X GET "https://url")
3. 验证token的实际内容
如果还是有问题,可以用以下命令查看token的真实内容(包括不可见字符):
echo "$token" | od -c
如果输出中包含\n(换行符)或其他非打印字符,说明需要进一步清理。
4. 合并curl命令(简化版)
可以直接在curl的Header中嵌入token获取命令,减少变量赋值步骤:
data=$(curl -s -H "X-Auth-Token: $(bash get-token.sh | grep x-subject-token | awk '{print $2}')" -X GET "https://url") echo "$data"
内容的提问来源于stack exchange,提问作者emretorx
相关产品推荐
相关产品推荐

