'single quote phrase' "double quote phrase"
当然,这不会产生正确的结果。
#1 楼
您可以使用以下字符串文字语法:> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
来自
man bash
形式为$'的单词字符串”经过特殊处理。该单词扩展为
到字符串,并按
ANSI C标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)的解码方式如下:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
\cx a control-x character
评论
过度杀伤力。在大多数情况下,您不需要使用字符串文字语法。
– fpmurphy
2012年2月5日在16:35
此处有更多详细信息stackoverflow.com/a/16605140/149221
–mj41
18年4月28日在13:18
#2 楼
在外壳中转义引号的简单示例:$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
通过完成已打开的一个(
'
),放置转义的一个(\'
),然后打开另一个('
)来完成。或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
这是通过完成已经打开的一个报价(
'
),将报价放在另一个报价("'"
),然后打开另一个('
)。相关:如何在单引号引起来的字符串中转义单引号?在stackoverflow SE
#3 楼
在POSIX Shell中,假设您的字符串中没有变量,命令或历史记录扩展,并且没有换行符,请遵循以下基本规定:引用一个泛型带单引号的字符串,请执行以下操作:
用具有相同序列的任何非单引号字符序列替换,并添加前导和尾随单引号:每个预先存在的单引号字符都带有反斜杠:
'aaa' ==> ''aaa''
特别是
' ==> \'
要对带双引号的通用字符串加引号,请执行以下操作: />
添加前导和尾随双引号:
''aaa'' ==> \''aaa'\'
每个双引号和每个反斜杠字符都带反斜杠转义:
aaa ==> "aaa"
几个示例:
''aaa""bbb''ccc\ddd'' ==> \'\''aaa""bbb'\'\''ccc\ddd'\'\'
==> "''aaa\"\"bbb''ccc\\ddd''"
,以便可以使用以下示例扩展您的示例:
#!/bin/sh
echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""
sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'
sudo su enzotib -c "echo \''aaa'\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\"bbb\\"\""
#4 楼
接受的答案适用于简单(一级)的引用:完成所有工作:$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
执行脚本以获取:
#!/bin/bash
quote () {
local quoted=${1//\'/\'\\'\'};
printf "'%s'" "$quoted"
}
read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_
quote "$line"; echo
quote "echo $(quote "$line")"; echo
第一行适用于简单回显:
$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''
第二行适用于双引号命令:
$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"
评论
这个报价功能是惊人的!可以在脚本中使用它来进行任意深度的引用,而不会造成指数级的丑陋。例如eval“ eval $(quote” eval $(quote“ eval $(quote” echo test“)”)“)”)“
–斯科蒂·贾米森(Scotty Jamison)
20 Sep 14 '15:33
#5 楼
回声“我是学生”不起作用。但是,下面的作品:
echo $'I \'ma student'
从bash的手册页:
单引号之间可能不会出现单引号,即使前面加上反斜杠。
....
$'string'形式的单词也经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。
评论
这不会为现有答案增加任何内容。
– Jasonwryan
18年1月3日,下午5:55
评论
为“当然,这不会产生正确的结果” +1。 bash快要让我生气了。...除了可以正常工作外,由于您的字符串嵌套在其他字符串中,因此您必须对引号进行两次转义。它在任何其他编程语言中的工作方式都相同:bash -c“ echo \”'单引号短语'\\\“双引号短语\\\\” \“”