Как вам избежать апострофа в одной строке в кавычках в Баше?

18

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

Вот пример:

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

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

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

Kibet
источник
echo \''Hello World'\'
математика

Ответы:

19

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

choroba
источник
1
Ты прав. Хитрость заключается в том, что в строке «Одиночная кавычка не может произойти betweeen одинарные кавычки , даже если ему предшествует обратный слэш» Так что , вероятно , разделяет его на несколько частей.
Kibet
@Colin Как только одна цитата в двух других одинарных (но) управляющими последовательностями, цитируемый цитата не реальная цитата больше. Это просто символ без особых характеристик спаривания.
zero2cx
1
@ zero2cx: Не правда:echo '\''
Чороба
@ zero2cx: я бы сказал «снаружи» вместо «внутри».
choroba
3
@choroba не "полностью" верно, в bash вы можете это сделатьecho $'\'hello world\''
bufh
9

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

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

См квотирования раздел в справочной bashстранице, в конце раздела. (Ищите «ANSI C».)

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

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

zero2cx
источник
3

Простой пример побега котировки в оболочке:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Это делается путем закрытия уже открытого one ( '), размещения экранированного one ( \') для печати, затем открытия другого ( ').

В качестве альтернативы:

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

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

kenorb
источник