Резервні боки обробляються спеціально echo -e
, але спочатку вони інколи обробляються спеціально шкаралупою (що в даному випадку є bash
), відповідно до правил котирування оболонки .
Аргумент echo
насправді бачить, є Hello\\n
. Оскільки ви перейшли -e
до цього echo
, він обробляє втечу зворотної косої риси спеціально і \\
згортається до єдиного \
. Фіналу n
не уникнути, тому він постає буквально.
Причиною цього є те, що до та окремо від самої роботи echo
оболонка розглядає \
спеціально в деяких контекстах, але не в інших. Некотируваних \
символи завжди розглядаються спеціально, в одинарних лапках \
, ніколи не розглядаються спеціально, але лікування в подвійних лапках \
символів, як в команді ви запускали, є більш тонким і складним.
Коли оболонка стикається з текстом із подвійним цитуванням у команді, як і у випадку "Hello\\\n"
, вона розглядає \
як символ втечі, коли вона передує символу, який може мати особливе значення всередині подвійних лапок, а не інакше .
- Оскільки
\
іноді має особливе значення всередині ""
, \
те, що негайно передує іншому \
, спричиняє цитування цієї секунди \
. Тож всередині подвійних лапок перші \\
потрапляють у \
.
- Після цих перших двох
\
символів з’являється третій \
символ, на який не впливають перші два, який передує n
. Але n
це не персонаж, до якого коли-небудь звертаються спеціально всередині подвійних цитат, тому \
до цього не звертаються спеціально в цій ситуації. Таким чином \n
залишається \n
.
Ефект полягає в тому, що в подвійних лапках \\\n
трактується як \\n
.
Коли echo -e
бачить \\n
, перший \
видаляє спеціальне значення з другого, тому echo
друкується \n
буквально для цього тексту.
Якщо ваша мета - надрукувати Hello
додатковий новий рядок, але без зворотних нахилів (питання спочатку було неоднозначним, плюс я думаю, що це корисний приклад), тоді одне рішення - видалити \
. Запуск echo -e "Hello\\n"
результатів Hello
з додатковою новою лінією в кінці.
Кращим рішенням є використання одиничних лапок і написання echo -e 'Hello\n'
. Одиночні котирування є найсильнішою формою цитування. Ще кращим рішенням є використання printf
замість того echo
, що в цьому випадку було б printf 'Hello\n\n'
.
Якщо ваша мета - друкувати, Hello\
включаючи зворотний проріз, з подальшим додатковим новим рядком , то підхід з подвійним цитуванням можливий, але громіздкий. Щоб зрозуміти це, працювати в зворотному напрямку: echo -e
звернених \\
до \
і \n
в символ нового рядка, і подвійні лапки звернених \\
до \
, так що ви можете зробити це з шістьма слеш ( echo -e "Hello\\\\\\n"
), так як \\n
перетворюється \n
з - за однієї зворотної косої межі втечі інший. Ви також можете зробити це з п'ятьма, оскільки подвійне цитування зберігається, \n
коли значення \
не уникне.
Це ілюструє перевагу одного цитування: просто поставте все, що ви хочете echo -e
побачити, в одній цитаті ( echo -e 'Hello\\\n'
). printf
тут також добре. Один варіант є printf 'Hello\\\n\n'
. Але де printf
справді світить, це те, що ви можете підключити додаткові аргументи. Ви можете використовувати printf '%s\n\n' 'Hello\'
, який вставляє другий аргумент (буквально Hello\
тому, що окремі цитати нічого не змінюють) замість %s
.