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

如何正确使用包含空格的Bash多参数变量并传递给脚本

问题根因

你遇到的问题本质是Bash的参数解析规则:直接写在命令行中的内容会被Bash解析转义符、引号等语法元素,而普通字符串变量展开后的单词拆分(word splitting)阶段只会按IFS(默认包含空格、制表符、换行符)拆分,不会处理转义符、引号,因此反斜杠会被识别为普通字符,导致参数拆分错误。

解决方案

以下方案按安全优先级从高到低排序:

  • 方案1:使用Bash数组(最优,无安全风险)
    这是Bash中处理多个带空格参数的标准实现,只需要修改prepare_flags.sh输出数组定义即可:
#!/bin/bash
# 修改后的prepare_flags.sh
echo 'TEST_ARGS=("1" "2" "3 4" "5")'

主脚本调用方式:

source <( ./prepare_flags.sh )
./test.sh "${TEST_ARGS[@]}" # 调用成功,输出和直接传参完全一致

原理是"${数组名[@]}"会将数组的每个元素作为独立参数传递,完整保留元素内部的空格,不会做额外拆分。

  • 方案2:使用eval转换字符串为数组(仅适用于输出内容可信的场景)
    如果无法修改prepare_flags.sh的输出,仍只能拿到带转义的字符串变量,可以用eval解析转义后存入数组:
source <( ./prepare_flags.sh )
eval "args=($TEST_ARGS)"
./test.sh "${args[@]}" # 调用成功

注意:eval会执行传入字符串中的任意命令,如果prepare_flags.sh的输出不可控,会存在命令注入风险,不可在不可信场景使用。你当前使用的bash -c方案和该方案原理类似,同样存在注入风险。

  • 方案3:借助xargs解析转义
    xargs默认会自动处理参数中的反斜杠转义和引号,也可以快速实现需求:
source <( ./prepare_flags.sh )
echo "$TEST_ARGS" | xargs ./test.sh # 调用成功

该方案同样存在安全风险,仅适用于输出内容完全可信的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:54:05