使用从 args 读取的命令和“未终止的带引号的字符串”/“意外的 EOF”从 sh(破折号)调用 bash

sda*_*aau 5 shell bash dash quoting escape-characters

只是想我会记录这个:我正在尝试一些非常简单的事情 - 在 中设置 env 变量bash,然后打印出来:

$ bash -c "a=1; echo a$a;"
a
$ bash -c "a=1; echo a\$a;"
a1
Run Code Online (Sandbox Code Playgroud)

现在我想要同样的东西,但作为参数调用sh(在我的系统上,ls -la $(which sh)给出/bin/sh -> dash):

$ sh -c "bash -c "a=1; echo a\$a;""
a$a

# obviously I have to escape inner quotes:

$ sh -c "bash -c \"a=1; echo a\$a;\""
a

# escape the dollar once more?

$ sh -c "bash -c \"a=1; echo a\\$a\" "
sh: Syntax error: Unterminated quoted string

# nope... inner single quotes, then?

$ sh -c "bash -c 'a=1; echo a$a;'"
a

# nope... escape the single quotes?

$ sh -c "bash -c \'a=1; echo a$a;\'"
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
a
sh: ': not found

# nope... escape the dollar too?

$ sh -c "bash -c \'a=1; echo a\$a;\'"
bash: -c: line 0: unexpected EOF while looking for matching `''
bash: -c: line 1: syntax error: unexpected end of file
a
sh: ': not found
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是 - 转义的正确语法是什么,以便sh -c [bash -c ...]给出与刚才相同的结果bash -c ...

sda*_*aau 1

好吧,我找到了一些可以工作的(注意,这是 Ubuntu 11.04):

$ sh -c "bash -c 'a=1; echo a\$a \'"
a1
$ sh -c "bash -c 'a=1; echo a\$a;'"
a1
Run Code Online (Sandbox Code Playgroud)

...看起来,只要第一个单引号没有转义,并且美元也被转义 - 它就有效,无论最后的单引号是否被转义!这仍然让我很困惑......