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

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

例如我想说

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

有没有不那么尴尬的方法来做到这一点,例如转义单引号?

是的,我知道我可以写

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

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

bash我感兴趣的是csh首先如何做这件事。

答案1

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

在 Bourne 类 shell(sh、ksh、ash、dash、bash、zsh 等)中,单引号字符串完全是文字。这样,就可以很容易地包含 shell 本来会特殊处理的字符,而不必对其进行转义,但这确实意味着单引号字符本身不能包含在单引号字符串中。

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

答案2

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

你好世界!

还有这个:

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

和这个:

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

你能解释一下你到底想做什么吗?

在 shell 中,例如 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这样做。

答案3

不确定我对上一个答案的编辑是否会出现:

粘贴相同的内容作为新答案:

替代方法:

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

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

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

' 的 ASCII 值为 39。

我需要这个来对一堆文件进行内联编辑以添加到感兴趣的位置。

答案4

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

使用 bash(但大多数时候仍使用 zsh)时,我使用它只是'\''因为它比 更容易阅读'"'"'

我完全不知道如何在 csh 中做到这一点。

相关内容