双引号里面的双引号怎么转义?

问题描述 投票:286回答:8

在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.

bash quotes
8个回答
285
投票

使用反斜杠。

echo "\""     # Prints one " character.

82
投票

在shell中使用反斜杠的一个简单例子。

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

它是通过完成一个已经打开的引号 ('),将逸出的一个(\'),然后再打开另一个(').

另外。

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

它是通过整理已经打开的一个('),在另一个引号中放置一个引号("'"),然后再打开另一个(').

更多的例子。在单引号字符串中去掉单引号。


63
投票

我不知道为什么今天这个老问题会出现在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.

28
投票

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


17
投票

查看 printf...

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

不使用printf

echo -e $mystr

输出:说 "你好"

使用 printf

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

产出:说 "嗨"


15
投票

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

dqt='"'echo "双引号${dqt}X${dqt}在双引号字符串内"

输出。

双引号 "X "在双引号的字符串中。

11
投票

使用$"string"。

在本例中,它将是:

dbload=$"加载数据本地infile \''gfpoint.csv'\"到表$dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\'' 中。LINES TERMINATED BY I'"'I'". 忽略1行"

注(自 人页):

一个双引号的字符串,如果前面是美元符号($"string"),将根据当前的locale翻译该字符串。如果当前的locale是C或POSIX,美元符号将被忽略。如果字符串被翻译和替换,则替换为双引号。


-5
投票

添加 "\" 在双引号前加注转义,而不是 \

#! /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
© www.soinside.com 2019 - 2024. All rights reserved.