例如我想说
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 中做到这一点。