如何在 bash shell 中转义引号?

如何在 bash shell 中转义引号?

我在 bash 中转义字符时遇到问题。我想在不同用户下运行命令时转义单引号和双引号。出于这个问题的目的,假设我想在屏幕上回显以下内容:

'single quote phrase' "double quote phrase"

如果我还需要切换到不同的用户,如何转义所有特殊字符:

sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""

当然,这不会产生正确的结果。

答案1

您可以使用以下字符串文字语法:

> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

man bash

$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

          \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

答案2

在 shell 中转义引号的简单示例:

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

其方法是完成已经打开的一个 ( '),放置已逃脱的一个 ( \'),然后打开另一个 ( ')。

或者:

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

这是通过完成已打开的一个 ( '),将引号放入另一个引号 ( "'"),然后打开另一个 ( ') 来完成的。

有关的:如何转义单引号字符串中的单引号?在 stackoverflow SE

答案3

在 POSIX shell 中,假设字符串中没有变量、命令或历史扩展,并且没有换行符,请遵循以下基本规定:

  1. 要使用单引号引用通用字符串,请执行以下操作:

    1. 将任何非单引号字符序列替换为添加了前导和尾随单引号的相同序列:'aaa' ==> ''aaa''

    2. 每隔一个反斜杠转义预先存在的单引号字符:' ==> \'
      特别是,''aaa'' ==> \''aaa'\'

  2. 要使用双引号引用通用字符串,请执行以下操作:

    1. 添加前导和尾随双引号:aaa ==> "aaa"

    2. 使用反斜杠转义每个双引号字符和每个反斜杠字符:" ==> \", \ ==> \\

举几个例子:

''aaa""bbb''ccc\\ddd''  ==>  \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
                        ==>  "''aaa\"\"bbb''ccc\\\\ddd''"

这样您的示例就可以通过以下内容进行扩展:

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

答案4

简单的

通过将输出管道传输到来删除双引号sed

sed 's/"//g'

例子

somethingThatProducesDoubleQuotesHere | removeDoubleQuotes

或者你可以使用一种方法让未来的生活变得更轻松

removeDoubleQuotes() {
  sed 's/"//g'
  # EXAMPLES:
  # somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
}

相关内容