如何在一个双引号里面加双引号?
任何人都可以告诉我如何在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中结束。
如果我对前面的例子给予相同的处理,看起来像这样:
$ echo “ I 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