Різниця між echo -e "<string>" і echo $ "<string>"


20

Яка різниця між використанням

echo -e "Hello\nWorld" 

і

echo $"Hello\nWorld" 

не обидва вони виходять:

Hello
World

1
Ви пробували? Другий виводить Hello\nWorld. Вам потрібен -eперемикач для інтерпретації втечі символів.
бекко

4
Для другого, я підозрюю, що ви мали намір написати це з одинарними цитатами echo $'Hello\nWorld', які будуть надруковані в двох рядках під bash.
John1024

@becko, так, я спробував це, і вони обидва виходять одне і те саме.
Марк

Відповіді:


33

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.


1
Також варто зазначити, що і Chet, і POSIX рекомендують використовувати, printfа неecho
geirha

@geirha Дуже хороші моменти. Відповідь оновлено.
John1024

1
Проблема несподіваних варіантів від глобусів (як *) насправді не специфічна echo. Це відбувається з будь-якою командою, яка розпізнає короткі або довгі параметри (написані традиційним способом) і приймає операнди файлів, в тому числіls . Можливо, ситуація трохи гірша, echoоскільки (як згадує джерело) echoзазвичай не приймається --вказувати кінець параметрів, тоді як можна писати такі команди, як ls -- *l. (І справді, зазвичай, потрібно писати команди таким чином при використанні глобусів, які починаються з *або -, особливо в сценаріях.)
Елія Каган

Дякую за грунтовну відповідь, я маю вправу для курсу "Операційні системи", і мені потрібно було роздрукувати якийсь текст за допомогою \nпослідовності евакуації, тому насправді не має значення, чи використовую я echo -e '...',echo $'...' абоecho $"..."
Mark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.