bash-hackers-wiki/docs/commands/builtin/echo.md
2024-03-30 14:09:26 -05:00

93 lines
3.9 KiB
Markdown

# The echo builtin command
## Synopsis
echo [-neE] [arg ...]
## Description
`echo` outputs it's args to stdout, separated by spaces, followed by a
newline. The return status is always `0`. If the
[shopt](../../commands/builtin/shopt.md) option `xpg_echo` is set, Bash
dynamically determines whether echo should expand escape characters
(listed below) by default based on the current platform. `echo` doesn't
interpret `--` as the end of options, and will simply print this string
if given.
### Options
Option Description
-------- ----------------------------------------------------------------------------------------------------------------
`-n` The trailing newline is suppressed.
`-e` Interpretation of the following backslash-escaped characters (below) is enabled.
`-E` Disables the interpretation of these escape characters, even on systems where they are interpreted by default.
### Escape sequences
Escape Description
-------------- ---------------------------------------------------------------------------------------------------------------
`\a` alert (bell)
`\b` backspace
`\c` suppress further output
`\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)
## Examples
## Portability considerations
- `echo` is a portability train wreck. No major shell follows POSIX
completely, and any shell that attempts to do so should be
considered horribly broken.
[SUSv4](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37)
specifies that `echo` **shall not** include any options. Further, it
specifies that the behavior of `-n` as a first argument shall be
determined by the implementation, unless XSI is followed, in which
case `-n` is always treated as a string, and backslash escapes are
interpreted by default. `dash` has the misfeature of following this
and interpreting escapes by default, but includes a `-n` feature for
suppressing newlines nevertheless.\
\
In practice, if you\'re able to assume a korn-like shell including
bash, mksh, or zsh, `echo` when used in simple cases is generally
reliable. For example, in the very common situation in which echo is
supplied with a single argument and whose output is to have a
newline appended, using `echo` is considered common practice.
```{=html}
<!-- -->
```
- **Never use options to `echo`! *Ever*!** Any time you feel tempted
to use `echo -e`, `-n`, or any other special feature of echo, **use
[printf](../../commands/builtin/printf.md) instead!** If portability is a
requirement, you should consider using `printf` *exclusively* and
just ignore that `echo` even exists. If you must use `echo -e` and
refuse to use `printf`, it is usually acceptable to use \'\'echo
\$\'\...\' \'\'if targeting only shells that support this special
quoting style.
```{=html}
<!-- -->
```
- `ksh93` has a `print` command, which if coding specifically for
`ksh93` should be preferred over `echo`.
[printf](../../commands/builtin/printf.md) still includes most of the
functionality of both, and should usually be the most preferred
option.
## See also
- [printf](../../commands/builtin/printf.md)
- <http://cfajohnson.com/shell/cus-faq.html#Q0b>
- <http://www.in-ulm.de/~mascheck/various/echo+printf/>