如何在一个双引号里面加双引号?

任何人都可以告诉我如何在bash中双string内部双引号转义?

例如在我的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 \"双引号转义。我不能使用单引号为我的variables,因为我想使用variables$dbtable

使用反斜杠:

 echo "\"" # Prints one " character. 

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

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

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

或者:

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

这是通过完成已经打开的一个( ' ),在另一个报价( "'" ),然后打开另一个( ' )报价。

更多示例: 在单引号string中转义单引号

Bash允许你相邻地放置string,他们最终会被粘在一起。

所以这:

 $ echo "Hello"', world!' 

产生

 Hello, world! 

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

 $ 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解释。 像" '这样的引号将会在结果variables中结束。

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

$ echoI like to use '' "double quotes" '' sometimes

检查出printf

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

不使用printf

 echo -e $mystr 

输出:说“嗨”

使用printf

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

输出:说“嗨”

我不知道为什么这个老问题今天在bash列表中猛增,但为了以防万一未来的研究人员,请记住,您可以通过使用您需要回声的字符的ascii代码避免转义。 例:

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

\x22是双引号的ASCII码(hex),单引号是\x27 。 同样,你可以回显任何字符。

我想如果我们尝试回显上面的string与反斜杠,我们将需要一个凌乱的两行backslashed回声… 🙂

对于variables赋值,这是等价的:

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

如果这个variables已经被其他程序设置了,你仍然可以用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 

利用$“string”。

在这个例子中,

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

注意(从手册页 ):

以美元符号($“string”)开头的双引号string将导致根据当前语言环境翻译该string。 如果当前的语言环境是C或POSIX,美元符号将被忽略。 如果string被翻译和replace,replace是双引号。

将双引号字符存储为variables:

 DQT = '“'
 echo“双引号$ {dqt} X $ {dqt}在双引号string”

输出:

双引号string中的双引号“X”

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

 #! /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