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

如何将bash全部参数传递给命令替换中的bash -c命令

问题原因

你的写法踩了Shell参数展开和命令替换的两个典型坑:

  • 第一种写法中,${@}展开后ls -la会被拆为两个独立参数,而bash -c的语法是bash -c <命令串> [位置参数],此时<命令串>仅取到ls,-la被识别为位置参数$0,自然不会生效
  • 第二种写法中,命令替换输出的转义引号只会被当做字面字符处理,不会被Shell识别为参数边界,展开后实际传递的参数是bash、-c、"ls、-la",引号不匹配直接触发语法错误
最简实现

如果你的参数没有特殊字符(引号、空格、通配符等),直接用"$*"拼接所有参数为单个字符串传给bash -c即可:

#!/bin/bash

echo "Args: $*"
if [[ $# -gt 0 ]]; then
  docker run ubuntu bash -c "$*"
else
  docker run ubuntu
fi
鲁棒实现(兼容所有特殊字符)

如果需要处理包含特殊字符的参数,用printf '%q'做参数转义,配合数组保留参数边界:

#!/bin/bash

echo "Args: $*"
docker_extra_args=()
if [[ $# -gt 0 ]]; then
  # 转义所有参数为可被Bash直接解析的字符串
  cmd_str=$(printf '%q ' "$@")
  docker_extra_args=(bash -c "$cmd_str")
fi
# 数组展开会严格保留参数边界,不会出现意外拆分
docker run ubuntu "${docker_extra_args[@]}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:04