16

Я не понимаю, как bash оценивает экранирование символов апострофа в одиночных кавычках.

Вот пример:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Я пытался найти объяснения этому, но ничего не смог получить. Что здесь делает Баш?

4 ответа4

17

В одинарных кавычках экранирование невозможно. Нет способа, как включить одинарные кавычки в одинарные кавычки. Смотри Цитаты в man bash.

6

В дополнение к одиночным и двойным кавычкам, поддерживаемым POSIX, bash предоставляет дополнительный тип кавычек, позволяющий небольшому классу экранированных символов (включая одинарные кавычки) в строке в кавычках:

$ echo $'\'Hello World\''
'Hello World'

Смотрите раздел QUOTING на странице руководства bash , ближе к концу раздела. (Ищите "ANSI C".)

3

Чтобы объяснить, что происходит с вашими избежавшими апострофами, мы рассмотрим ваш второй пример (также смотрите одиночные кавычки или сильные кавычки):

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

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

3

Простой пример экранирования кавычек в оболочке:

$ 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'

Связанный: Как избежать одиночных кавычек в одиночных кавычках?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .