You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过变量向Shell命令传递带引号的参数?

解决跨脚本传递带空格的命令参数问题

你的核心问题是跨脚本传递包含空格或特殊字符的命令参数:直接用字符串传递会被错误拆分,用数组的话子脚本无法继承父脚本的数组环境变量(因为Shell环境变量仅支持字符串类型)。以下是两种可行的解决方法:

方法1:将数组转为安全字符串通过环境变量传递

父脚本把数组参数转成Shell可解析的安全字符串,子脚本再将字符串还原为数组。

Script A

# 定义参数数组
LS_ARGS_OVERRIDE=(-a --color="hello world")
# 将数组转为安全的字符串格式,存入环境变量
export LS_ARGS_OVERRIDE_STR=$(printf '%q ' "${LS_ARGS_OVERRIDE[@]}")
# 调用子脚本
./B

Script B

# 将环境变量中的字符串还原为数组
eval "LS_ARGS_OVERRIDE=($LS_ARGS_OVERRIDE_STR)"
# 执行命令,正确传递参数
ls "${LS_ARGS_OVERRIDE[@]}" -l .

原理:printf '%q '会把每个参数转成Shell能正确解析的格式(比如包含空格的参数会被自动加上合适的引号),子脚本用eval将字符串重新解析为数组,完整保留原始参数格式。

方法2:通过命令行参数传递数组

直接把数组作为命令行参数传给子脚本,子脚本通过"$@"接收并重构数组。

Script A

# 定义参数数组
LS_ARGS_OVERRIDE=(-a --color="hello world")
# 将数组作为参数传给子脚本
./B "${LS_ARGS_OVERRIDE[@]}"

Script B

# 将命令行参数存入数组(接收脚本名后的所有参数)
LS_ARGS_OVERRIDE=("$@")
# 执行命令
ls "${LS_ARGS_OVERRIDE[@]}" -l .

原理:命令行参数传递会完整保留每个参数的边界,子脚本用"$@"接收时,每个原始数组元素都会被当作独立参数,不会被错误拆分。

为什么之前的方法失效?

  • 直接用字符串传递:Shell会按空格拆分字符串,带空格的参数(比如--color="hello world")会被拆成--color="hello和world",导致参数错误。
  • 父脚本的数组无法被子脚本继承:Shell环境变量只能存储字符串,数组无法通过export传递给子进程,所以子脚本中LS_ARGS_OVERRIDE[@]为空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:35:04