You need to enable JavaScript to run this app. Bash脚本如何通过变量正确传递包含空格的命令参数
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本如何通过变量正确传递包含空格的命令参数

解决方案

方案1:使用Bash数组存储命令参数(最推荐)

这是Bash中处理含空格参数的标准最佳实践,无需使用eval,同时避免安全风险:

URL="http://192.168.0.13:8774/v2.1/servers"
HEADER="X-Auth-Token: 12345678"
METHOD="GET"

# 将命令的每个部分作为独立元素存入数组
CMD=(curl -H "$HEADER" "$URL")

# 执行命令,"${CMD[@]}"会保留每个数组元素的完整性,不会按空格拆分
"${CMD[@]}"

原理是"${数组名[@]}"展开时会将每个数组元素作为独立的字符串传递,就算元素内部包含空格、特殊符号也不会被Shell错误拆分。

方案2:转义字符串中的引号(不推荐)

如果必须用字符串形式存储命令,需要手动转义内层双引号,保证eval解析时能正确识别参数边界:

URL="http://192.168.0.13:8774/v2.1/servers"
HEADER="X-Auth-Token: 12345678"
METHOD="GET"

# 转义内层双引号,让eval能正确识别参数
CMD="curl -H \"$HEADER\" \"$URL\""

eval "$CMD"

该方案存在明显缺陷:如果变量中包含双引号、反斜杠等特殊字符,依然会出现解析错误,同时eval会执行任意拼接的代码,存在注入安全风险。

方案3:使用位置参数(兼容POSIX sh环境)

如果需要兼容没有数组功能的POSIX标准Shell,可以用位置参数存储命令:

URL="http://192.168.0.13:8774/v2.1/servers"
HEADER="X-Auth-Token: 12345678"
METHOD="GET"

# 重置位置参数为命令的各个部分
set -- curl -H "$HEADER" "$URL"

# 执行命令,"$@"会保留每个位置参数的完整性
"$@"

内容的提问来源于stack exchange,提问作者osflw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 07:06:14