Поскольку вы вызываете программу (например, 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"!
Там у нас это есть. Мы должны использовать одну обратную косую черту sh, чтобы правильно экранировать наши кавычки в 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 различных комбинаций символов, чтобы выяснить, какая правильная комбинация ;-).
Или, давайте go вернемся к bash
и выясним, что может происходить. Во-первых, давайте вспомним, что строка, являющаяся echo
ed, интерпретируется как строка. Итак, давайте поместим двойные кавычки вокруг нашего оператора echo, чтобы он обрабатывался как строка, и посмотрим, что он делает. Помните, что из этого мы хотим, чтобы выходные данные были такой же командой bash
ранее, с обратной косой чертой:
HAL9256@HAL9000:~$ echo "\'Hello\' \"World\"!"
\'Hello\' "World"!
Что ж, в конечном итоге, то, что мы хотим отправить на bash
, это та оригинальная строка с обратной косой чертой. Здесь мы видим, что обратные слэши избегают двойных кавычек и исчезают. Итак, добавляя еще косые черты:
HAL9256@HAL9000:~$ echo "\'Hello\' \\"World\\"!"
\'Hello\' \World\!
О, отлично. Мы избежали обратной косой черты. Как и в начале, продолжайте добавлять escape-символы, пока он не заработает ....
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. Другой способ, и, на мой взгляд, более легкий для понимания способ выхода из двойных кавычек - это использовать две двойные кавычки вместо обратной черты, например: