如何在双引号内逃避双引号?

Sea*_*yen 260 bash quotes

任何人都可以告诉我如何在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)

  • 不工作.`X = LS; if [-f"$(其中"\""$ x"\"")"]; 然后回声存在; 否则回声破碎; fi;`给予破碎而`... [ - f"$(其中$ x)"]; ......`或`... [ - f $("$ x")]; ......`工作得很好.当`$ x`或`$("$ x")`的结果给出任何带有空格或其他特殊字符的东西时会出现问题.解决方法是使用变量来保存`which`的结果,但是bash真的无法逃避引用或者我做错了什么? (8认同)
  • 你好,你的方法不行。请删除您的答案,因为它可能已经浪费了很多有用的时间。正确的答案由 @kenorb 发布,您的答案仅在终端调用时有效,但不适用于 bash 文件。您在此处发布(可能是剪切粘贴解决方案)之前自己尝试过吗:(? (5认同)
  • @AndroidEngineX,如果使用正确,此方法可以正常工作。Luc 的上述评论使用错误;他们告诉“which”搜索名称中带有文字引号的可执行文件,当然不存在这样的东西。这是卢克自己的问题,而不是这个答案的错误。 (2认同)

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('),将引用放在另一个引号("'")中,然后打开另一个(')来完成的.

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

  • 对于双引号,这似乎不必要地复杂:`echo "abc\"abc"` 足以产生 `abc"abc`,如 Peter 的回答。 (2认同)
  • 在这个简单的例子中确实如此,但在嵌套引号的复杂情况下,可能有必要这样做,@kenorb 的例子帮助我弄清楚如何处理这些情况。 (2认同)

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)

  • 这应该被标记为答案. (2认同)
  • 这就是答案!我爱你,先生。 (2认同)

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"

  • 哎呀...那是丑陋的东西。 (2认同)

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)

输出:说"你好"

  • 请注意,`printf`也会逃避更多字符,例如```,`(`和`)` (2认同)
  • 没有理由将[printf`包装成[无用的`echo`](http://www.iki.fi/era/unix/award.html#echo).你的两个例子都没有引用.正确的解决方法是双引号变量. (2认同)

小智 14

将双引号字符存储为变量:

dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"

输出:

Double quotes "X" inside a double quoted string

  • Bash确实是最糟糕的语言 (25认同)

Tri*_*jee 10

使用$"string".

在这个例子中,它会是,

dbload = $"加载数据本地infile \"'gfpoint.csv'\"进入表$ dbtable FIELDS TERMINATED BY','''''''''''''''''''''''''''''

注意(来自手册页):

带有美元符号($"string")的双引号字符串将导致根据当前语言环境转换字符串.如果当前区域设置为C或POSIX,则忽略美元符号.如果翻译并替换字符串,则替换为双引号.

  • 不错,不认识那个。 (3认同)