如何在双引号内逃避双引号?

时间:2010-09-30 21:05:45

标签: bash quotes

有人可以告诉我如何在bash的双字符串中转义双引号吗?

例如在我的shell脚本中

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

我无法正确地使用双引号转义来获取\"的ENCLOSED BY。我不能对我的变量使用单引号,因为我想使用变量$dbtable

8 个答案:

答案 0 :(得分:246)

使用反斜杠:

echo "\""     # Prints one " character.

答案 1 :(得分:60)

在shell中转义引号的简单示例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

通过完成已经打开的一个('),放置一个(\'),然后打开另一个(')来完成。

可替换地:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

通过完成已经打开的一个('),将引号放在另一个引号("'")中,然后打开另一个引号(')来完成。

更多示例:Escaping single-quotes within single-quoted strings

答案 2 :(得分:46)

我不知道为什么今天这个老问题出现在bash标记的列表中,但是为了以后的研究人员,请记住,你可以通过使用你需要回应的字符的ascii代码来避免逃避。 例如:

echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"                                                                                                          
this is "'"'"text"'"'" 

\x22是双引号的ascii代码(十六进制),单引号的\x27。同样,你可以回复任何一个字符。

我想如果我们尝试用反斜杠回显上面的字符串,我们需要一个凌乱的两行反斜回声......:)

对于变量赋值,这是等价的:

$ a=$'this is \x22text\x22'                                                                                                                                               
$ echo "$a"                                                                                                                                                               
this is "text"

如果该变量已由另一个程序设置,您仍然可以使用sed或类似工具应用双/单引号。 例如:

$ b="just another text here"
$ echo "$b"
just another text here
$ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
just another "0" here #this is not what i wanted to be
$ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.

答案 3 :(得分:22)

Bash允许你相邻放置字符串,它们最终会粘在一起。

所以这个:

$ echo "Hello"', world!'

产生

Hello, world!

诀窍是根据需要在单引号和双引号字符串之间切换。不幸的是,它很快变得非常混乱。例如:

$ echo "I like to use" '"double quotes"' "sometimes"

产生

I like to use "double quotes" sometimes

在你的例子中,我会这样做:

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

产生以下输出:

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

很难看到这里发生了什么,但我可以使用Unicode引号对其进行注释。以下不会在bash中工作 - 它只是为了说明:

dbload= 'load data local infile "'“'gfpoint.csv'” '" into'“table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '” '"'“' LINES” 'TERMINATED BY "'“'\n'” '" IGNORE 1 LINES'

上面的“''”这样的引号将由bash解释。像" '这样的引号最终会出现在结果变量中。

如果我对前面的例子给出相同的处理,它看起来像这样:

$ echoI like to use"double quotes"sometimes

答案 4 :(得分:14)

查看 printf ...

#!/bin/bash
mystr="say \"hi\""

不使用printf

echo -e $mystr

输出:说&#34; hi&#34;

使用 printf

echo -e $(printf '%q' $mystr)

输出:说\&#34; hi \&#34;

答案 5 :(得分:12)

将双引号字符存储为变量:

dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"

输出:

Double quotes "X" inside a double quoted string

答案 6 :(得分:9)

使用$“string”。

在这个例子中,它将是,

  

dbload = $“将数据加载数据本地infile \”'gfpoint.csv'\“进入表$ dbtable FIELDS TERMINATED BY',''''''''''''''''''''''''''' “

注意(来自man page):

  

以美元符号($“string”)开头的双引号字符串将导致根据当前语言环境翻译字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换字符串,则替换为双引号。

答案 7 :(得分:-4)

在双引号之前添加"\"以转义它,而不是\

#! /bin/csh -f

set dbtable = balabala

set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES"

echo $dbload
# load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES