Яка різниця між використанням
echo -e "Hello\nWorld"
і
echo $"Hello\nWorld"
не обидва вони виходять:
Hello
World
echo $'Hello\nWorld', які будуть надруковані в двох рядках під bash.
Яка різниця між використанням
echo -e "Hello\nWorld"
і
echo $"Hello\nWorld"
не обидва вони виходять:
Hello
World
echo $'Hello\nWorld', які будуть надруковані в двох рядках під bash.
Відповіді:
echo -eі echo $'...'вони подібні тим, що підтримують такі послідовності втечі:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
Вони мають відмінності. Крім перерахованого, echo -eпідтримує:
\c suppress further output
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
Навпаки, $'....'підтримує:
\' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \cx a control-x character
Зауважте, що між ними \cрозширення несумісні:
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
Для цього echo -eвище \cпригнічується подальший вихід, ігноруючи тим самим Istop. Навпаки, для $'...', \cIінтерпретується як вкладка.
$"..."На відміну $'...'від функції, функція $"..."зовсім інша. Це призведе до того, що рядок, який він містить, буде перекладено відповідно до поточного локалу.
echo -eспориecho -eне підтримується оболонками, і багато хто вважає цей -eваріант помилкою в дизайні. Дотримуйтесь:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
Як бачите, якщо те, що ви друкуєте, echoпочинається з тире, результати можуть бути несподіваними. Якщо ви не впевнені, що перший рядок, який ви будете друкувати echo, не починається з тире, ви, ймовірно, краще будете використовувати printf.
З цих причин стандарт POSIX укладає :
Новим програмам рекомендується використовувати printf замість відлуння.
Чет Рамі, який підтримує bashостанні 22 роки, погоджується :
[N] Код ew повинен використовувати printf.
*) насправді не специфічна echo. Це відбувається з будь-якою командою, яка розпізнає короткі або довгі параметри (написані традиційним способом) і приймає операнди файлів, в тому числіls . Можливо, ситуація трохи гірша, echoоскільки (як згадує джерело) echoзазвичай не приймається --вказувати кінець параметрів, тоді як можна писати такі команди, як ls -- *l. (І справді, зазвичай, потрібно писати команди таким чином при використанні глобусів, які починаються з *або -, особливо в сценаріях.)
\nпослідовності евакуації, тому насправді не має значення, чи використовую я echo -e '...',echo $'...' абоecho $"..."
Hello\nWorld. Вам потрібен-eперемикач для інтерпретації втечі символів.