Как избежать апостроф в строке в кавычках в 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. Открыт 1-й апостроф:',
  2. Закрыто сразу после него \', так что строка становится: '\',
  3. Hello World это не кавычки.
  4. Размещенный автономный апостроф (\') не открывая его.
  5. Последний апостроф (') открывает строку, но ожидаемой закрывающей строки нет.

Таким образом, правильный пример будет:

$ 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" снова ведет себя так, как если бы она была в сильных кавычках, только с добавленным апострофом (экранированный, поэтому больше не одиночная кавычка) в конце.

Когда в конце добавляется еще одна одинарная кавычка (ваш оригинальный пример), строка остается висящей и ожидает закрывающей кавычки.

Другие вопросы по тегам