在 Powershell 中,我想运行以下命令:
bash -c "echo 'hello world!'"
(我知道我可以直接使用 echo
或 Write-Host
,但我需要使用 bash -c
)并且我想hello
用单引号括起来,world
用双引号括起来。换句话说,我想要以下输出:
'hello' "world"!
我应该转义那些引号吗?
最佳答案
由于您正在调用程序(例如 bash
),“正常”规则为 escape quotation characters不一定以“相同”的方式工作。您不是通过 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
ed 的字符串被解释为字符串。所以让我们在我们的 echo 语句周围加上双引号,这样它就被当作一个字符串来对待,看看它做了什么。请记住,我们想要的是输出与前面相同的 bash
命令,但带有反斜杠:
HAL9256@HAL9000:~$ echo "\'Hello\' \"World\"!"
\'Hello\' "World"!
好吧,最终我们要发送给 bash
的是带有反斜杠的原始字符串。在这里我们可以看到反斜杠正在转义双引号并消失。因此,添加更多斜杠:
HAL9256@HAL9000:~$ echo "\'Hello\' \\"World\\"!"
\'Hello\' \World\!
哦,太好了。我们逃脱了反斜杠。像 Inception 一样,不断添加转义字符直到它起作用....
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"!
关于powershell - 在 Powershell 中转义引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60892453/