我如何逃脱双引号内的双字符串在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"

我不能得到由'\"'与双引号括起来正确转义。我的变量不能使用单引号,因为我想使用变量$dbtable。


当前回答

对于在Bash脚本中可能包含空格的变量,请在主引号内使用三引号,例如:

[ "$(date -r """$touchfile""" +%Y%m%d)" -eq "$(date +%Y%m%d)" ]

其他回答

使用$"string"。

在这个例子中,它是,

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

注意(来自手册页):

双引号字符串前面加一个美元符号($"string")将导致该字符串根据当前语言环境进行翻译。如果当前区域设置为C或POSIX,则忽略美元符号。如果转换并替换了字符串,则替换的字符串会被双引号括起来。

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

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

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

另外:

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

它是通过结束已经打开的一个('),在另一个引号(“'”)中放置一个引号,然后打开另一个(')来完成的。

更多示例:在单引号字符串中转义单引号

在双引号前添加“\”来转义,而不是\

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

对于在Bash脚本中可能包含空格的变量,请在主引号内使用三引号,例如:

[ "$(date -r """$touchfile""" +%Y%m%d)" -eq "$(date +%Y%m%d)" ]

使用反斜杠:

echo "\""     # Prints one " character.