提问人:Sean Nguyen 提问时间:10/1/2010 最后编辑:Peter MortensenSean Nguyen 更新时间:4/25/2023 访问量:579547
如何对双引号中的双引号进行转义?
How can I escape a double quote inside double 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"
我无法正确使用双引号进行转义。我不能对我的变量使用单引号,因为我想使用变量。ENCLOSED BY '\"'
$dbtable
答:
使用反斜杠:
echo "\"" # Prints one " character.
评论
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
... [ -f "$(which $x)" ]; ...
... [ -f $(which "$x") ]; ...
$x
$(which "$x")
which
grep -oh "\"\""$counter"\""\w*"
$counter
which
\w
grep
查看 printf...
#!/bin/bash
mystr="say \"hi\""
不使用 printf
echo -e $mystr
输出:说“嗨”
使用 printf
echo -e $(printf '%q' $mystr)
输出:说“嗨”
评论
printf
'
(
)
printf %q
生成 ready for 的字符串,而不是格式化的 字符串。eval
echo -e
在 shell 中转义引号的简单示例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
它的完成方法是完成一个已经打开的 (),放置转义的 (),然后打开另一个 ()。'
\'
'
或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
它是通过完成已经打开的一个 (),将引号放在另一个引号 () 中,然后打开另一个引号 () 来完成的。'
"'"
'
更多示例:在单引号字符串中转义单引号
评论
echo "abc\"abc"
abc"abc
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
评论
echo
echo
echo a b c
a b c
echo 'a b c'
a b c
使用 $“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,则忽略美元符号。如果字符串被翻译和替换,则替换是双引号。
评论
在双引号前添加以转义它,而不是"\"
\
#! /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
评论
csh
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"
# Output:
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.
评论
echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
将双引号字符存储在变量中:
dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"
输出:
Double quotes "X" inside a double quoted string
评论
要与 Bash 脚本中可能包含空格的变量一起使用,请在主引号内使用三引号,例如:
[ "$(date -r """$touchfile""" +%Y%m%d)" -eq "$(date +%Y%m%d)" ]
评论
$( )
[ "$(date -r "$touchfile" +%Y%m%d)" -eq "$(date +%Y%m%d)" ]
使用怎么样.echo
例如
x=$(echo \"a b c\")
要使用该变量,
echo $x && ls "$x"
我更喜欢 echo 而不是 printf 的原因是它更直接。
上一个:如何在Java字符串中输入引号?
评论
$dbtable