Резервні боки обробляються спеціально 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.