m33*_*lky 113 shell quoting escape-characters
我在 bash 中转义字符时遇到问题。我想在不同用户下运行命令时转义单引号和双引号。出于这个问题的目的,假设我想在屏幕上回显以下内容:
'single quote phrase' "double quote phrase"
Run Code Online (Sandbox Code Playgroud)
如果我还需要切换到其他用户,我该如何转义所有特殊字符:
sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""
Run Code Online (Sandbox Code Playgroud)
当然,这不会产生正确的结果。
Sie*_*geX 142
您可以使用以下字符串文字语法:
> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
Run Code Online (Sandbox Code Playgroud)
man bash$'string' 形式的词被特殊处理。单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:
Run Code Online (Sandbox Code Playgroud)\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character
ken*_*orb 29
在 shell 中转义引号的简单示例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
它是通过完成已经打开的一个('),放置转义的一个(\'),然后打开另一个(')来完成的。
或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
它是通过完成已经打开的一个 ( '),将引号放在另一个引号 ( "'") 中,然后打开另一个 ( ') 来完成的。
相关:如何在单引号字符串中转义单引号?在 stackoverflow SE
enz*_*tib 13
在 POSIX shell 中,假设您的字符串中没有变量、命令或历史扩展,并且没有换行符,请遵循以下基本规定:
要使用单引号引用通用字符串,请执行以下操作:
用添加的前导和尾随单引号替换具有相同序列的任何非单引号字符序列: 'aaa' ==> ''aaa''
使用反斜杠转义每个预先存在的单引号字符:' ==> \'
特别是,''aaa'' ==> \''aaa'\'
要使用双引号引用通用字符串,请执行以下操作:
添加前导和尾随双引号: aaa ==> "aaa"
使用反斜杠转义每个双引号字符和每个反斜杠字符: " ==> \", \ ==> \\
几个例子:
''aaa""bbb''ccc\\ddd'' ==> \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
==> "''aaa\"\"bbb''ccc\\\\ddd''"
Run Code Online (Sandbox Code Playgroud)
这样您的示例就可以扩展为以下内容:
#!/bin/sh
echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""
sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'
sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""
Run Code Online (Sandbox Code Playgroud)
小智 7
接受的答案适用于简单(一级)引用:
$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
Run Code Online (Sandbox Code Playgroud)
要使命令生效,您需要引用两次。
这个脚本可以完成所有的工作:
#!/bin/bash
quote () {
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_
quote "$line"; echo
quote "echo $(quote "$line")"; echo
Run Code Online (Sandbox Code Playgroud)
执行脚本得到:
$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''
Run Code Online (Sandbox Code Playgroud)
第一行适用于简单的回声:
$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"
Run Code Online (Sandbox Code Playgroud)
第二行适用于双引号命令:
sudo su USER -c 'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''
Run Code Online (Sandbox Code Playgroud)