Shell脚本执行curl拉取Bitwarden成员列表时header部分报错求解
问题根因
你将包含空格、嵌套引号的请求头参数存入了普通字符串变量,Bash执行命令时会按空格对变量内容做分词处理,字符串里的双引号会被识别为普通文本而非参数边界符。原本完整的-H "accept: text/plain"会被拆分为-H、"accept:、text/plain"三个独立参数,curl会把text、Bearer、XXXX这类拆分出来的内容误识别为请求地址,所以报无法解析主机的错误。
正确写法
推荐使用数组存储多参数,数组可以严格保留每个参数的边界,不会被错误拆分:
#!/bin/bash CURL="/usr/bin/curl" BITHTTP="https://api.bitwarden.com/public/members" # 所有curl参数存入数组,每个元素对应一个独立参数 CURL_FULL_ARGS=( -X GET "$BITHTTP" -H "accept: text/plain" -H "Authorization: Bearer XXXX" ) # 执行时用 "${数组名[@]}" 格式展开,保证参数边界正确 "$CURL" "${CURL_FULL_ARGS[@]}" > /tmp/bitmembers
如果不需要复用header参数,也可以直接在执行curl时指定参数,不要将带空格的header存入普通字符串变量:
#!/bin/bash CURL="/usr/bin/curl" BITHTTP="https://api.bitwarden.com/public/members" "$CURL" -X GET "$BITHTTP" -H "accept: text/plain" -H "Authorization: Bearer XXXX" > /tmp/bitmembers
注意事项
- 不要用普通字符串存储包含空格、特殊符号的命令参数,Bash的分词机制会破坏参数结构
- 多参数存储优先用Bash数组,展开时必须加双引号包裹
"${数组名[@]}",才能保留参数边界 - URL、文件路径这类可能带特殊字符的变量,执行时建议用双引号包裹,避免被特殊字符拆分
内容的提问来源于stack exchange,提问作者Nina G
相关产品推荐
相关产品推荐

