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


11

例如 我想说

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

有没有比较尴尬的方法,例如转义单引号?

是的,我知道我会写

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

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

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

Answers:


9

Dennis在他的答案中指出了通常的选择(单双,双单,单引号字符串与转义的单引号连接;您已经提到了Perl的可定制引号运算符),但这也许就是您正在寻找的直接答案对于。

在类似Bourne的shell(sh,ksh,ash,dash,bash,zsh等)中,单引号字符串完全是字面量。这样可以很容易地包含一些字符,而这些字符本来可以在无需转义的情况下进行特殊处理,但这确实意味着单引号字符本身不能包含在单引号字符串中。

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


谢谢。“这是不可能的”-这是我所期望的答案:)尽管我一直希望在这里发挥作用的只是文档。
codeholic 2010年

与Perl不同,类似于Bourne的shell此处的文档仅对通过stdin提供输入直接有用。您当然可以在其中加上单引号。(EG):您还可以通过引用这个词使这里文件“文本模式” blah <<\EOF … EOF。您也可以使用<<'EOF'<<"EOF。它们都意味着此处的文字(与Perl不同)。如果您确实有决心,则可以执行此操作blah "$(cat<<\EOF … EOF )" other args(使用换行符,我在命令替换处写了空格; ksh和zsh可以在没有cat的情况下运行,其他人则需要它)。但这真的值得吗?
克里斯·约翰森

只是要注意zsh单引号并不完全是文字。Zsh将尝试在单引号字符串中的任何位置将“ \ U”解释为字符代码,例如回显echo '\U0000068\U000069'“ hi”。不知道为什么,除非它是外壳程序中的错误。
马修(Matthew)

1
@Matthew:\U在这种情况下,解释是通过内置的echo命令完成的(此行为可以通过-E或BSD_ECHO选项和来控制-e)。您可以看到文字字符串是在其他命令中传递的(而不是以其他方式解释的)。例如printf %s\\n '\U0000068\U000069'
克里斯·约翰森

@ChrisJohnsen谢谢,我是zsh的新手,没有意识到这一点,但是您是对的。手册页告诉我-e是默认设置,但zsh必须覆盖它。
马修(Matthew)

5

对我来说,所有示例都产生了:

你好,世界!

这样做也是这样:

perl -e 'print "Hello, world!", "\n";'

和这个:

perl -e 'print '\''Hello, world!'\'', "\n";'

您能说明您要做什么吗?

在外壳(例如Bash)中,如果要在字符串中打印引号,则一种引号会转义另一种。

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

编辑:

这是另一种方式:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

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


1

不知道我对前一个答案的编辑是否会显示:

粘贴与新答案相同:

替代方法:

当我尝试您的解决方案时,我仍然无法打印。

但是我从您的解决方案中得到了启发,并尝试了以下方法:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

的ASCII值是39。

我需要这样做才能对文件堆进行内联编辑,以在感兴趣的位置添加'。


1

这里的文档是不关心转义的最佳方法:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

您可以使用此处引用的文件完全承担全部责任:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

如果要将其作为参数而不是输入传递,则可以使用xargs:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

我不知道是否有在bash中执行此操作的选项,但是使用zsh可以''在启用该RC_QUOTES选项后使用。(我建议尝试使用zsh;它主要与bash兼容,并且可以模拟bash以获得更大的兼容性。)

使用bash(大多数情况下仍使用zsh),我只是使用'\''它,因为它比容易阅读'"'"'

我完全不知道如何在csh中执行此操作。


-1

如果在内部将Perl用作Perl脚本的一部分,则可以使用\'和\“来对perl进行引号转义。我不确定命令行是否会接受。您可以尝试一下,看看它是否有效。


3
如果这么简单,我不会问。您可以尝试一下,然后在发布答案之前查看它是否有效。
codeholic 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.