我在转义bash中的字符时遇到麻烦。我想在其他用户下运行命令时转义单引号和双引号。出于这个问题的目的,我想在屏幕上回显以下内容:给其他用户:

'single quote phrase' "double quote phrase"


当然,这不会产生正确的结果。

评论

为“当然,这不会产生正确的结果” +1。 bash快要让我生气了。

...除了可以正常工作外,由于您的字符串嵌套在其他字符串中,因此您必须对引号进行两次转义。它在任何其他编程语言中的工作方式都相同:bash -c“ echo \”'单引号短语'\\\“双引号短语\\\\” \“”

#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