如何在一个双引号里面加双引号?
任何人都可以告诉我如何在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