在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
.
使用反斜杠。
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
它是通过整理已经打开的一个('
),在另一个引号中放置一个引号("'"
),然后再打开另一个('
).
更多的例子。在单引号字符串中去掉单引号。
我不知道为什么今天这个老问题会出现在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.
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解释。像这样的引号 " '
将最终进入结果变量中。
如果我给前面的例子做同样的处理,它看起来是这样的。
$ echo
“I like to use
”‘
"double quotes"
’“
sometimes
”
查看 printf...
#!/bin/bash
mystr="say \"hi\""
不使用printf
echo -e $mystr
输出:说 "你好"
使用 printf
echo -e $(printf '%q' $mystr)
产出:说 "嗨"
将双引号字符存储为变量。
dqt='"'echo "双引号${dqt}X${dqt}在双引号字符串内"
输出。
双引号 "X "在双引号的字符串中。
使用$"string"。
在本例中,它将是:
dbload=$"加载数据本地infile \''gfpoint.csv'\"到表$dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\'' 中。LINES TERMINATED BY I'"'I'". 忽略1行"
注(自 人页):
一个双引号的字符串,如果前面是美元符号($"string"),将根据当前的locale翻译该字符串。如果当前的locale是C或POSIX,美元符号将被忽略。如果字符串被翻译和替换,则替换为双引号。
添加 "\"
在双引号前加注转义,而不是 \
#! /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