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

bash -c执行命令时如何保留字符串双引号?附-c参数含义说明

Bash -c 参数相关问题解答

1. bash -c 参数的具体含义

-c 是 Bash 的命令行选项,作用是告知 Bash 直接从该选项后紧跟的第一个字符串参数中读取命令内容,解析执行完成后立即退出,不会启动交互式Shell会话。
需要注意:-c 后的命令字符串会先被当前调用Bash的父Shell做一轮变量替换、转义解析,处理完成后才会传给新启动的Bash子进程执行,多层解析是特殊字符(比如双引号)丢失的核心原因。

2. 传递字符串时保留原双引号的方法

你之前的写法失效,是因为双引号包裹的命令串被父Shell提前解析:

  • 执行bash -c "echo \"$var\""时,父Shell会先把转义的\"解析为普通双引号,同时替换$var为"abc",最终传给子Bash的实际命令是echo ""abc"",Bash执行时会把相邻的空引号对识别为空串拼接,最终只输出无引号的abc
  • 执行bash -c "echo $var"时,父Shell替换$var后传给子Bash的命令是echo ""abc"",和上面的执行逻辑完全一致,结果相同

可通过以下两种方式实现双引号保留,优先推荐第一种,无转义兼容问题:

  • 用单引号包裹传给子Shell的命令主体(单引号内的内容父Shell不会做任何解析替换),通过位置参数把原变量传给子Shell:
bash -c 'echo "$1"' bash "$var"

该写法中,单引号内的echo "$1"会原样传给子Bash,单引号后第一个参数bash是子Shell的$0(用于标识进程名),第二个参数"$var"会作为子Shell的$1位置参数传入,子Shell执行时会读取到完整的带双引号的变量值,输出结果和当前会话直接执行echo "$var"完全一致。

  • 如果必须用双引号包裹命令串,需要对变量内的双引号做二次转义,保证父Shell解析一轮后,传给子Shell的命令里仍保留正确的转义引号:
bash -c "echo \"${var//\"/\\\"}\""

该写法通过参数替换把变量内所有的"替换为\",父Shell解析完成后传给子Bash的命令为echo "\"abc\"",执行后可输出带双引号的结果,但该写法需要手动处理多层转义,特殊字符较多时容易出错,非必要不使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:18:28