Какова разница между использованием
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 $'...'
оба похожи в том, что они поддерживают следующие escape-последовательности:
\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 вместо echo.
Чет Рами, который поддерживал в bash
течение прошлых 22 лет, соглашается :
[N] Новый код должен использовать printf.
*
) на самом деле не является специфической echo
. Это происходит с любой командой, которая распознает короткие или длинные опции (записанные традиционным способом) и принимает операнды имени файла, включаяls
. Возможно, ситуация немного хуже, echo
поскольку (как упоминает ваш источник) echo
обычно не принимает --
указание окончания опций, в то время как можно писать такие команды, как ls -- *l
. (И действительно, обычно следует писать команды таким образом, когда используются глобусы, начинающиеся с *
или -
, особенно в сценариях.)
\n
последовательности символов, так что на самом деле это не имеет значения , если я использую echo -e '...'
, echo $'...'
илиecho $"..."
Hello\nWorld
. Вам нужен-e
переключатель для интерпретации escape-символов.