Как избежать апостроф в строке в кавычках в bash?
Я не понимаю, как bash оценивает экранирование символов апострофа в одиночных кавычках.
Вот пример:
$ echo ''\''Hello World'\'''
'Hello World' # works
$ echo '\'Hello World\''
> # expects you to continue input
Я пытался найти объяснения этому, но ничего не смог получить. Что здесь делает Баш?
4 ответа
В одинарных кавычках экранирование невозможно. Нет способа, как включить одинарные кавычки в одинарные кавычки. См. Цитирование в man bash.
В дополнение к одиночным и двойным кавычкам, поддерживаемым POSIX, bash
предоставляет дополнительный тип кавычек, чтобы разрешить небольшой класс экранированных символов (включая одинарные кавычки) в строке в кавычках:
$ echo $'\'Hello World\''
'Hello World'
Смотрите раздел Цитирование в bash
справочная страница, ближе к концу раздела. (Ищите "ANSI C".)
Простой пример экранирования кавычек в оболочке:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Это делается закрытием уже открытого ('
), размещение сбежавшего (\'
) распечатать, а затем открыть еще один ('
).
В качестве альтернативы:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Это делается путем отделки уже открытой одной ('
), разместив цитату в другой цитате ("'"
), затем открываем еще один ('
).
Что ты сделал ('\'Hello World\''
), является:
- Открыт 1-й апостроф:
'
, - Закрыто сразу после него
\'
, так что строка становится:'\'
, Hello World
это не кавычки.- Размещенный автономный апостроф (
\'
) не открывая его. - Последний апостроф (
'
) открывает строку, но ожидаемой закрывающей строки нет.
Таким образом, правильный пример будет:
$ echo \'Hello World\'
'Hello World'
Связанный: Как избежать одиночных кавычек в одиночных кавычках?
Чтобы объяснить, что происходит с вашими избежавшими апострофами, мы рассмотрим ваш второй пример (также смотрите одиночные кавычки или сильные кавычки):
$ echo '\'Hello World\''
> # expects you to continue input
Здесь вы оставили предложение висящим, как вы заявили. Теперь обрежьте конец и измените его на:
v v v
$ echo '\'Hello World # Echo two strings: '\' and 'Hello World'.
\Hello World ^
Подстрока "Hello World" здесь не была заключена в кавычки, но она вела себя так, как если бы она была в сильных кавычках. Используя ваш пример снова, обрежьте конец по-другому:
vv v (plain apostrophe)
$ echo '\'Hello World\' # Will echo: '\' and 'Hello World''
\Hello World' ^^ # Note that the trailing ' char is backslash escaped.
Подстрока "Hello World" снова ведет себя так, как если бы она была в сильных кавычках, только с добавленным апострофом (экранированный, поэтому больше не одиночная кавычка) в конце.
Когда в конце добавляется еще одна одинарная кавычка (ваш оригинальный пример), строка остается висящей и ожидает закрывающей кавычки.