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 ...
?
好吧,我找到了一些可以工作的(注意,这是 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)
...看起来,只要第一个单引号没有转义,并且美元也被转义 - 它就有效,无论最后的单引号是否被转义!这仍然让我很困惑......