Bash 防止shell转义单引号

Bash 防止shell转义单引号,bash,sh,Bash,Sh,脚本: 我希望在运行此shell脚本时,命令行可以像这样展开: #!/bin/sh -x ARGS="" CMD="./run_this_prog" . . . ARGS="-first_args '-A select[val]' " . . . $CMD $ARGS 相反,shell所做的(注意在每个单引号前添加“\”): 以及它在命令行上运行的内容(转义了每个特殊字符-不是我想要的): 我试着转义单引号,如: ./run_this_prog -first_args \'\-A sele

脚本:

我希望在运行此shell脚本时,命令行可以像这样展开:

#!/bin/sh -x
ARGS=""
CMD="./run_this_prog"
. . . 
ARGS="-first_args '-A select[val]' "
. . . 
$CMD $ARGS
相反,shell所做的(注意在每个单引号前添加“\”):

以及它在命令行上运行的内容(转义了每个特殊字符-不是我想要的):

我试着转义单引号,如:

./run_this_prog -first_args \'\-A select\[val\]\'
但这导致(在每个反斜杠后添加“\”):

我在谷歌上搜索了一下,但找不到任何相关信息。我错过了什么?
我在rel6 centOS上使用的是sh-3.2。

一旦引号位于字符串中,它将无法按您希望的方式工作:在字符串中,引号不是语法元素,它们只是文字字符。这就是bash提供数组的原因之一

替换:

+ ARGS=
+ CMD='./run_this_prog'
+ ARGS='-first_args \'\''-A select[val]\'\'' '
与:


有关此问题更详细的讨论,请参阅:

我认为shell会按照您的要求执行。您看到的那些附加的
\'
只供您在屏幕上看到(当您运行
sh-x时)。就在屏幕上。至于
sh
存储在内存中的内容是您告诉它存储的内容,我认为这已经是正确的了。因此,
sh
不会“转义”您的数据,它只是它在屏幕上显示内容的方式。此外,如果您要使用数组,请将shebang更改为
#/bin/bash
@chepner很好。我只是在答案上加了一句话。另外,感谢您的编辑添加缺少的引号。感谢您的输入。这有帮助!现在这是一个救命恩人。非常感谢。
./run_this_prog -first_args \'\-A select\[val\]\'
ARGS="-first_args \'-A select[val]\' "
+ ARGS=
+ CMD='./run_this_prog'
+ ARGS='-first_args \'\''-A select[val]\'\'' '
#!/bin/sh -x
...
ARGS="-first_args '-A select[val]' "
$CMD $ARGS
#!/bin/bash -x
...
ARGS=(-first_args '-A select[val]')
"$CMD" "${ARGS[@]}"