首页 > 解决方案 > 在 Powershell 中转义引号

问题描述

在 Powershell 中,我想运行以下命令:

bash -c "echo 'hello world!'"

(我知道我可以直接使用echoor Write-Host,但我需要使用bash -c)并且我想hello用单引号和world双引号括起来。换句话说,我想要以下输出:

'hello' "world"!

我应该避开那些引号吗?

标签: powershellescapingquotes

解决方案


由于您正在调用程序(例如bash)“正常”规则来转义引号字符,因此不一定以“相同”的方式工作。您将参数传递给程序,而不是 PowerShell 解释字符串(通常遵循“正常”引用规则) 。这以完全不同的方式解释。

TLDR:要转义引号字符需要以下命令:

bash -c "echo \'Hello\' \\\""World\\\""!"

输出:

'Hello' "World"!

现在看起来非常复杂。所以,让我们分解一下。

bash首先,输出所需报价的正确命令是什么?让我们尝试常规引号:

HAL9256@HAL9000:~$ echo 'Hello' "World"!
Hello World!

没有引号。哦耶!我必须逃离他们。在bash我必须用反斜杠(\)转义它们:

HAL9256@HAL9000:~$ echo \'Hello\' \"World\"!
'Hello' "World"!

我们有它。我们必须使用一个反斜杠来正确地转义我们在bash. 因此,让我们将其插入 PowerShell:

PS C:\> bash -c "echo \'Hello\' \"World\"!"
/bin/bash: -c: line 0: unexpected EOF while looking for matching `"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

好吧,那没有用。哦,对了,在PowerShell中,我们必须用反引号 (`) 转义双引号,因为它们位于一组双引号中:

PS C:\> bash -c "echo \'Hello\' \`"World\`"!"
'Hello' World!

好吧,这并没有出错,但仍然不是我们想要的。引号仍然没有正确转义。嗯。在这里,您开始输入 100 种不同的字符组合,以找出正确的组合;-)。

或者,让我们回过头来bash弄清楚可能发生了什么。首先,让我们记住正在echo编辑的字符串被解释为字符串。因此,让我们在 echo 语句周围加上双引号,以便将其视为字符串,看看它做了什么。请记住,我们想要的输出是bash之前的相同命令,带有反斜杠:

HAL9256@HAL9000:~$ echo "\'Hello\' \"World\"!"
\'Hello\' "World"!

好吧,最终我们想要发送的bash是带有反斜杠的原始字符串。在这里我们可以看到反斜杠正在转义双引号并消失。因此,添加更多斜杠:

HAL9256@HAL9000:~$ echo "\'Hello\' \\"World\\"!"
\'Hello\' \World\!

哦,太好了。我们避开了反斜杠。像《盗梦空间》一样,不断添加转义字符直到它起作用....

HAL9256@HAL9000:~$ echo "\'Hello\' \\\"World\\\"!"
\'Hello\' \"World\"!

那里!我们有我们的输出。现在我们必须将它输入到 PowerShell 中:

PS C:\> bash -c "echo \'Hello\' \\\"World\\\"!"
/bin/bash: -c: line 0: unexpected EOF while looking for matching `"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

哦!是的,和以前一样的错误。我们必须记住用反引号转义 PowerShell 中的双引号:

PS C:\> bash -c "echo \'Hello\' \\\`"World\\\`"!"
'Hello' "World"!

成功!只需要大量的转义,无论是bash-wize 还是 PowerShell-wize。另一种方式,在我看来,在双引号内转义更容易理解的方式是使用两个双引号而不是像这样的反引号:

PS C:\> bash -c "echo \'Hello\' \\\""World\\\""!"
'Hello' "World"!

推荐阅读