任何人都可以告诉我如何在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"
Run Code Online (Sandbox Code Playgroud)
我无法\"正确使用双引号转义来获取ENCLOSED BY .我不能对我的变量使用单引号,因为我想使用变量$dbtable.
Pet*_*ter 270
使用反斜杠:
echo "\"" # Prints one " character.
Run Code Online (Sandbox Code Playgroud)
ken*_*orb 72
在shell中转义引号的简单示例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
这是通过完成已经打开的one('),放置一个(\'),然后打开另一个(')来完成的.
或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
这是通过完成已经打开的one('),将引用放在另一个引号("'")中,然后打开另一个(')来完成的.
更多示例:在单引号字符串中转义单引号
Geo*_*iou 55
我不知道为什么今天在bash标记的列表中出现了这个旧问题,但是为了以后的研究人员,请记住,你可以通过使用你需要回应的字符的ascii代码来避免转义.例:
echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"
this is "'"'"text"'"'"
Run Code Online (Sandbox Code Playgroud)
\x22是双引号和\x27单引号的ascii代码(十六进制).同样,你可以回显任何char.
我想如果我们尝试用反斜杠回显上面的字符串,我们将需要一个凌乱的两行反斜回声...... :)
对于变量赋值,这是等效的:
$ a=$'this is \x22text\x22'
$ echo "$a"
this is "text"
Run Code Online (Sandbox Code Playgroud)
如果该变量已由另一个程序设置,您仍然可以使用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.
Run Code Online (Sandbox Code Playgroud)
Bee*_*tle 23
Bash允许你相邻放置字符串,它们最终会粘在一起.
所以这:
$ echo "Hello"', world!'
Run Code Online (Sandbox Code Playgroud)
产生
Hello, world!
Run Code Online (Sandbox Code Playgroud)
诀窍是根据需要在单引号和双引号字符串之间切换.不幸的是,它很快变得非常混乱.例如:
$ echo "I like to use" '"double quotes"' "sometimes"
Run Code Online (Sandbox Code Playgroud)
产生
I like to use "double quotes" sometimes
Run Code Online (Sandbox Code Playgroud)
在你的例子中,我会这样做:
$ 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
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES
Run Code Online (Sandbox Code Playgroud)
很难看到这里发生了什么,但我可以使用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解释.引号" '就会在结果变量中结束.
如果我对前面的例子给出相同的处理,它看起来像这样:
$ echo" I like to use" ‘"double quotes"' “sometimes"
Dan*_*ong 16
看看printf ...
#!/bin/bash
mystr="say \"hi\""
Run Code Online (Sandbox Code Playgroud)
不使用printf
echo -e $mystr
Run Code Online (Sandbox Code Playgroud)
输出:说"嗨"
使用printf
echo -e $(printf '%q' $mystr)
Run Code Online (Sandbox Code Playgroud)
输出:说"你好"
小智 14
将双引号字符存储为变量:
dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"
输出:
Double quotes "X" inside a double quoted string