有没有办法在shell中转义单引号?

cod*_*lic 11 bash shell escape-characters csh

例如 我想说

perl -e 'print '"'"'Hello, world!'"'"', "\n";'
Run Code Online (Sandbox Code Playgroud)

有没有一种不那么尴尬的方法,例如转义单引号?

是的,我知道我可以写

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'
Run Code Online (Sandbox Code Playgroud)

但是这个问题是关于在 shell 中引用,而不是在 Perl 中引用。

我感兴趣的是如何做到这一点的bash,并csh摆在首位。

Chr*_*sen 9

丹尼斯在他的回答中指出了通常的替代方案(单双、单双、单引号字符串与转义单引号连接;您已经提到 Perl 的可自定义引号运算符),但也许这就是您正在寻找的直接答案为了。

在类似 Bourne 的 shell(sh、ksh、ash、dash、bash、zsh 等)中,单引号字符串完全是文字。这使得包含 shell 将要特别处理的字符变得容易,而不必对它们进行转义,但这确实意味着单引号字符本身不能包含在单引号字符串中。

我什至拒绝考虑 csh 类型的 shell,因为它们在其他方面完全被破坏(参见Csh 编程被认为有害)。


Den*_*son 5

对我来说,你所有的例子都会产生:

你好,世界!

这样做也是如此:

perl -e 'print "Hello, world!", "\n";'
Run Code Online (Sandbox Code Playgroud)

和这个:

perl -e 'print '\''Hello, world!'\'', "\n";'
Run Code Online (Sandbox Code Playgroud)

你能澄清一下你想要做什么吗?

在 shell 中,例如 Bash,如果您想将引号作为字符串的一部分打印出来,一种类型的引号会转义另一种类型。

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'
Run Code Online (Sandbox Code Playgroud)

编辑:

这是另一种方式:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '
Run Code Online (Sandbox Code Playgroud)

感叹号后的空格避免了历史扩展错误。我本来可以这样做的set +H