Як уникнути апострофа в одному цитованому рядку в баші?


18

Я не розумію, як Баш оцінює втечу символів апострофа в одних цитованих рядках.

Ось приклад:

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

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

Я намагався шукати пояснення цьому, але нічого не зміг отримати. Що тут робить баш?


echo \''Hello World'\'
математика

Відповіді:


19

В одинарних котируваннях неможливе втеча. Немає способу включити єдину цитату в єдині цитати. Дивіться цитування в man bash .


1
Ти маєш рацію. Хитрість полягає в тому рядку: "Єдине котирування може не відбуватися між одинарними котируваннями навіть тоді, коли передує зворотна косої риси".
Кібет

@Colin Як тільки одна цитата знаходиться в двох інших одиничних котируваннях (але зворотній косий), цитата вже не є реальною цитатою. Це просто заклинання без особливих характеристик сполучення.
zero2cx

1
@ zero2cx: Неправда:echo '\''
choroba

@ zero2cx: Я б сказав "зовні" замість "всередині".
choroba

3
@choroba не "абсолютно" правда, в баш можна зробитиecho $'\'hello world\''
bufh

9

Окрім POSIX, що підтримується одно- та подвійним цитуванням, bashнадає додатковий тип цитування, щоб дозволити малому класу уникнутих символів (включаючи одну цитату) у рядку, що цитується:

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

Дивіться розділ QUOTING на bashсторінці man, наприкінці розділу. (Шукати "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'

Пов’язано: Як уникнути одноцитат у рядах з цитатами з одним цитуванням?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.