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
相关产品推荐
相关产品推荐

