Bash变量引号展开问题:curl调用REST API时参数解析异常
变量展开异常的原因
这是Bash普通字符串变量的展开规则导致的:
- 存入普通字符串变量的引号属于字面量字符,不会被Bash识别为划分参数边界的语法符号
- 不带引号引用
${CURL_ARGS}时,Bash会默认按IFS(空格、制表符、换行符)对变量内容做单词分割,不会解析其中的引号来合并带空格的参数
你定义的CURL_ARGS变量实际存储内容为 -H "Content-Type: application/json" --data @somefile.json,展开时会被拆分为5个独立参数:-H、"Content-Type:、application/json"、--data、@somefile.json,其中多余的双引号和错误的参数拆分,就是curl无法正常识别请求头的原因。
正确解决方案
使用Bash数组存储动态命令参数,数组的每个元素天然对应一个独立参数,不会被错误拆分:
#!/bin/bash # 改用数组存储curl动态参数 CURL_ARGS=(-H "Content-Type: application/json" --data @somefile.json) # 其他变量定义保持不变 set -o xtrace # 执行前打印命令 # 数组展开必须用 "${数组名[@]}" 格式,保证每个元素作为独立参数传递 curl -k -X "${PROTOCOL}" -u "${CICD_USER}:${CICD_PW}" "${CURL_ARGS[@]}" "${URL}" -v
该写法展开后的命令格式完全符合预期,curl可以正常解析所有参数。
内容的提问来源于stack exchange,提问作者dovregubben
相关产品推荐
相关产品推荐

