任何人都可以告诉我如何在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
.
8 回答
使用反斜杠:
在shell中转义引号的简单示例:
这是通过完成已经打开的一个(
'
),放置逃脱的一个(\'
),然后打开另一个('
)来完成的 .或者:
这是通过完成已经打开的一个(
'
),将报价放在另一个报价("'"
),然后打开另一个报价('
)来完成的 .更多例子:Escaping single-quotes within single-quoted strings
我不知道为什么今天在bash标记的列表中出现了这个旧问题,但是为了以后的研究人员,请记住,你可以通过使用你需要回应的字符的ascii代码来避免转义 . 例:
\x22
是双引号的ascii代码(十六进制),单引号的\x27
. 同样,你可以回显任何char .我想如果我们尝试用反斜杠回显上面的字符串,我们将需要一个凌乱的两行反斜回声...... :)
对于变量赋值,这是等效的:
如果该变量已由另一个程序设置,您仍然可以使用sed或类似工具应用双/单引号 . 例:
Bash允许你相邻放置字符串,它们最终会粘在一起 .
所以这:
产生
诀窍是根据需要在单引号和双引号字符串之间切换 . 不幸的是,它很快变得非常混乱 . 例如:
产生
在你的例子中,我会这样做:
产生以下输出:
很难看到这里发生了什么,但我可以使用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 ......
不使用printf
输出:说“嗨”
使用 printf
输出:说“你好”
将双引号字符存储为变量:
输出:
使用$“string” .
在这个例子中,它会是,
注意(来自man page):
在双引号之前添加
"\"
以逃避它,而不是\