echo Command in Linux With Examples

Use the echo command in Linux to print text, variables, escapes, prompts, and redirected output while avoiding common traps.

PublishedAuthorJoshua JamesRead time9 minGuide typeLinux Commands

Short status messages, prompts, and quick pipeline input usually start with the echo command in Linux because it is available in every normal shell session. The catch is that echo is simple only when the data is simple: shell expansion, escape handling, and newline behavior can change what reaches the terminal or the next command.

Most interactive Bash sessions resolve plain echo to Bash’s builtin first, while /usr/bin/echo and /bin/sh can behave differently. Use echo for predictable, human-facing messages; switch to the printf command in Linux when scripts need portable formatting, unknown input, or exact escape behavior.

Understand the echo Command in Linux

The Bash manual documents the builtin form as echo [-neE] [arg ...]. Bash writes its arguments separated by spaces and adds a newline unless -n suppresses it. The GNU Coreutils echo manual documents the external GNU utility, while the uutils echo documentation covers the compatible Rust implementation used by some current distributions.

POSIX keeps echo intentionally narrow. The POSIX echo specification states that portable scripts cannot rely on -n or backslash-containing arguments behaving the same everywhere, and it recommends printf for new applications that need those historical behaviors. Use echo -n and echo -e as Bash and common Linux conveniences, not as portable sh patterns.

echo Command Syntax

echo [OPTION]... [STRING]...
  • STRING is one or more arguments to print. The shell removes quotes and expands variables or globs before echo receives those arguments.
  • -n suppresses the final newline in Bash and common external implementations.
  • -e enables backslash escape interpretation in Bash and common external implementations.
  • -E disables backslash escape interpretation. This is the normal Bash default unless shell options change it.

Check Which echo Command Runs

Bash resolves the builtin before the external utility. Use type -a when an option or output difference makes the implementation important.

type -a echo

Typical Bash output includes:

echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

That means plain echo uses the shell builtin. Run /usr/bin/echo --version only when you need to identify the external implementation; it may identify GNU Coreutils, uutils coreutils, BusyBox, or another provider depending on the distribution and image.

echo Quick Reference

TaskCommand PatternWhat It Does
Print one lineecho 'Deployment complete'Writes text followed by a newline.
Print several argumentsecho alpha beta gammaPrints arguments separated by single spaces.
Print a blank lineechoOutputs only a newline.
Suppress the newlineecho -n readyLeaves the cursor on the same line after the text.
Expand escapesecho -e 'one\ntwo'Treats \n, \t, and related escapes as control characters.
Keep escapes literalecho -E 'one\ntwo'Prints the backslash sequence as text.
Print a literal wildcardecho '*'Prevents the shell from expanding * to filenames.
Show the last exit statusecho "$?"Prints the status value saved by the shell after the previous command.
Print command outputecho "Kernel: $(uname -s)"Expands command substitution before printing the message.
Print a calculationecho "$((3 + 4))"Uses shell arithmetic expansion before printing the result.
Color terminal textecho -e '\033[31mError\033[0m'Sends ANSI color escapes to a compatible interactive terminal.
Overwrite a fileecho 'status=ready' > status.txtWrites the line to a file, replacing existing content.
Append to a fileecho 'mode=test' >> status.txtAdds the line to the end of the file.
Write to stderrecho 'error: missing config' >&2Sends a diagnostic message to standard error.

Practical echo Command Examples

Print One Line of Text

A quoted string is the safest shape for ordinary status text because spaces stay inside one argument before echo prints it.

echo 'Linux command output'
Linux command output

Print Quotes and Special Characters

Choose quotes based on what the shell should expand before echo runs. Double quotes can contain a literal apostrophe while still allowing variable expansion, and single quotes keep dollar signs, wildcard characters, and redirection symbols as plain text.

echo "It's ready"
echo 'Use > to redirect output'
echo 'Price: $5'
It's ready
Use > to redirect output
Price: $5

Print Several Arguments

When echo receives several arguments, it prints them with one space between each argument.

echo alpha beta gamma
alpha beta gamma

That spacing comes from echo, not from the original source text. If exact spacing, tabs, or padding matters, use printf instead.

Preserve or Collapse Extra Spaces

Quoted whitespace stays inside one argument. Unquoted whitespace is parsed by the shell as argument separators, so repeated spaces collapse before echo receives the text.

echo 'one   two'
echo one   two
one   two
one two

Print a Blank Line

With no arguments, echo prints a newline. That is useful for separating sections of script output.

echo
echo 'Next section starts here'
Next section starts here

The blank first line is the output from the first echo call.

Suppress the Trailing Newline with echo -n

Use -n when a Bash prompt or short status marker must stay on the same terminal line. The extra printf call makes the missing newline visible.

echo -n ready
printf '<END>\n'
ready<END>

Use this in Bash-specific scripts or interactive commands. For portable scripts, write the same prompt with printf '%s' 'ready'.

Expand Escape Sequences with echo -e

The -e option makes Bash interpret supported backslash escapes such as \n for a newline and \t for a tab.

echo -e 'one\ntwo'
one
two

Keep echo -e out of portable sh scripts. Shells can disagree on whether -e is an option, ordinary text, or controlled by a shell setting.

Print Tab-Separated Text

The \t escape prints a tab when escape interpretation is enabled. This is fine for quick terminal output, but scripts that build tabular data should use printf so the format stays explicit.

echo -e 'NAME\tSTATUS'
NAME	STATUS

Keep Backslashes Literal with echo -E

The -E option disables escape interpretation. In normal Bash sessions, this is already the default, but the explicit flag can make an example clearer.

echo -E 'one\ntwo'
one\ntwo

Print Colored Terminal Text

ANSI escape sequences can color interactive terminal messages when echo -e interprets them. The sequence starts red text and then resets the terminal style after the word.

echo -e '\033[31mError\033[0m'

Do not rely on colored echo output in logs, cron jobs, or scripts that may run outside an interactive terminal. Use printf for script formatting and keep color optional when output may be captured.

Stop Output Early with \c

When escape interpretation is enabled, \c stops further output and suppresses the final newline. Use it sparingly because text after \c disappears.

echo -e 'start\cignored'
printf '<END>\n'
start<END>

The word ignored is never printed because \c stops the echo output before that point.

Print a Variable Value

The shell expands variables before echo runs. Double quotes allow expansion while preserving the expanded value as one argument.

name='Ada'
echo "Hello, $name"
Hello, Ada

Print Literal Dollar Signs with Single Quotes

Single quotes prevent variable expansion, so echo receives the dollar sign as ordinary text.

echo 'Hello, $name'
Hello, $name

Use this when documenting commands, printing templates, or showing a variable name rather than its current value.

Print Environment Variables

Common examples such as echo $HOME and echo $PATH work because the shell expands the variable first. Quote the expansion so spaces or wildcard characters inside a value do not split into separate arguments.

echo "Home directory: $HOME"
echo "Search path: $PATH"

Use printenv HOME or printenv PATH when the task is to inspect the environment rather than build a message around it.

Print the Last Exit Status with echo

The $? value belongs to the shell, not to echo. It stores the exit status from the previous command, so run echo "$?" immediately after the command you want to inspect.

true
echo "$?"
false
echo "$?"
0
1

An exit status of 0 means success for most commands. A nonzero value means failure, false, no match, or another command-specific result, so interpret it through the command that ran before echo "$?".

Print Command Substitution Results

Command substitution runs first, then echo prints the substituted text. This works well for short status messages built from predictable command output.

echo "Kernel name: $(uname -s)"
Kernel name: Linux

Do not wrap large or multi-line command output in echo when spacing, records, or trailing newlines matter. Let the original command print directly, or capture and format the value with printf.

Print Arithmetic Expansion Results

Bash arithmetic expansion evaluates integer expressions before echo prints the line. This is useful for counters and simple script messages.

count=3
echo "Next item: $((count + 1))"
Next item: 4

Print Wildcard Characters Literally

An unquoted * is a shell glob. Quote wildcard characters when the message should contain the symbol instead of matching filenames in the current directory.

echo '*'
*

Quote Values That May Contain Globs

Unquoted variables can expand again after the variable value is substituted. A controlled temporary directory makes the difference visible without touching real project files.

tmp_dir=$(mktemp -d)
(
  if cd "$tmp_dir"; then
    touch alpha.log beta.log
    pattern='*.log'
    echo $pattern
    echo "$pattern"
  fi
)
rm -rf -- "$tmp_dir"

The two echo lines produce different output:

alpha.log beta.log
*.log

The unquoted $pattern expands to matching filenames. The quoted "$pattern" prints the literal pattern. Quote variables by default, especially when values can contain spaces, wildcard characters, or paths supplied by users.

Use echo in Files, Streams, and Prompts

Write echo Output to a File

Shell redirection decides where echo output goes. The > operator overwrites a file, while >> appends to the existing file.

echo 'status=ready' > status.txt
echo 'mode=test' >> status.txt
cat status.txt
rm -f status.txt
status=ready
mode=test

Use a real editor or a quoted heredoc for multi-line configuration files. echo is better suited to short one-line files, simple logs, and generated status markers.

Send echo Output to Standard Error

Scripts should send diagnostics to standard error so normal output can still be piped or captured cleanly. Add the >&2 redirection to the message.

echo 'error: missing config' >&2

For more complex diagnostics, prefer printf '%s\n' 'message' >&2 so option-like text and backslashes remain data rather than echo options or escapes.

Pass Simple Text Through a Pipeline

echo can feed simple, known text into another command. For real files or multi-line input, prefer file redirection or a heredoc so the data source stays visible.

echo 'alpha beta gamma' | grep beta
alpha beta gamma

When filtering real command output, pipe the original command directly into the grep command in Linux instead of using echo as an unnecessary middle step.

Use echo -n Before the read Command

Bash scripts sometimes use echo -n to print a prompt before reading input on the same line.

echo -n 'Project name: '
read -r project
echo "Project: $project"

That works in Bash, but printf 'Project name: ' is the portable prompt form. Review the read command in Linux when the script needs timeouts, hidden input, arrays, or delimiter-aware parsing.

Avoid Common echo Portability Traps

Do Not Use echo for Unknown Option-Like Text

echo does not provide a reliable end-of-options marker. In Bash and the common external implementations used in many Linux systems, -- is printed as ordinary text rather than ending option parsing.

echo -- hello
-- hello

If the text may begin with -n, -e, -E, or another option-like string, use printf and pass the value as data.

value='-n'
printf '%s\n' "$value"
-n

Do Not Rely on echo -e in sh Scripts

/bin/sh is not always Bash, and even Bash can change echo behavior when invoked in POSIX-oriented modes. On common Linux distributions, one sh may print -e as text while another treats it as an escape option. Avoid that branch entirely in portable scripts.

printf '%b\n' 'one\ntwo'
one
two

The %b format makes printf expand backslash escapes deliberately, and %s\n keeps text literal when escape expansion is not wanted.

Do Not Wrap File Output in echo

Command substitution can change whitespace before echo sees the text. An unquoted substitution splits words and flattens line breaks, which is why echo $(cat file) is a poor way to display file content.

printf 'one\ntwo\n' > sample.txt
echo $(cat sample.txt)
cat sample.txt
rm -f sample.txt
one two
one
two

The first line comes from echo $(cat sample.txt); the next two lines come from cat sample.txt. Print file content with cat, input redirection, or a tool that understands the data format instead of round-tripping it through echo.

Do Not Use echo for Structured Data

echo cannot preserve records, fields, NUL bytes, binary data, or exact quoting rules reliably. Use a data-aware tool when the output is more than a simple human-readable line.

  • Use printf for exact strings, formatted fields, and portable prompts.
  • Use cat, input redirection, or heredocs for existing files and multi-line literal blocks.
  • Use JSON, YAML, CSV, or shell-specific tooling instead of building structured output with ad hoc echo lines.

Troubleshoot Common echo Problems

Backslash Escapes Print Literally

If \n or \t appears as text, escape interpretation is disabled or unsupported in the current command form.

echo 'one\ntwo'
one\ntwo

Use echo -e only when the command is intentionally Bash-specific. A portable script should retest with printf instead.

printf '%b\n' 'one\ntwo'
one
two

The %b format expands backslash escapes explicitly, so the result does not depend on the current shell’s echo rules.

echo -e Prints -e as Text

This usually means the shell or external implementation does not treat -e as an option in that context. Check the shell and command resolution before changing the script.

printf '%s\n' "$0"
type -a echo

If the script must run under sh, replace the echo -e line with a portable printf command and retest the output.

printf '%b\n' 'one\ntwo'
one
two

If the script intentionally requires Bash behavior, run it with a Bash shebang such as #!/usr/bin/env bash instead of relying on whatever /bin/sh points to.

Text Beginning with -n Disappears

A value that begins with -n, -e, or -E can be interpreted as an echo option even when the value came from a variable. The marker makes the missing output visible.

value='-n'
echo "$value"
printf '<END>\n'
<END>

Print option-like data with printf so the value is handled as an argument, not as an echo flag.

printf '%s\n' "$value"
-n

Variables Expand into Filenames or Multiple Words

Unquoted variables are split and expanded by the shell before echo receives them. Inspect the value with a fixed printf format so spaces and wildcard characters are visible as one argument.

printf '<%s>\n' "$value"

If the diagnostic prints the intended value as one bracketed field, quote the variable in the original echo command or switch to printf for exact output.

echo "$value"
printf '%s\n' "$value"

File Content Is Overwritten After Redirection

A single > redirection truncates the file before writing the new line. Use >> when the old content should remain.

echo 'first line' > notes.txt
echo 'second line' >> notes.txt
cat notes.txt
rm -f notes.txt
first line
second line

If a file was overwritten accidentally, stop writing to that path and restore it from version control, a backup, or another known-good source before continuing.

sudo echo Still Says Permission Denied

sudo echo does not make shell redirection privileged. The shell opens the target file before sudo runs echo, so a root-owned file can still fail with Permission denied.

sudo install -m 0644 /dev/null /tmp/lc-echo-root-demo.conf
bash -c "sudo echo 'setting=value' > /tmp/lc-echo-root-demo.conf"

Relevant error line includes:

bash: line 1: /tmp/lc-echo-root-demo.conf: Permission denied

Pipe the text into a privileged writer such as sudo tee, then verify and remove the disposable demo file.

echo 'setting=value' | sudo tee /tmp/lc-echo-root-demo.conf > /dev/null
sudo cat /tmp/lc-echo-root-demo.conf
sudo rm -f /tmp/lc-echo-root-demo.conf
setting=value

Conclusion

echo fits short shell messages, prompts, known variable output, simple redirection, and quick pipeline input. Keep variables quoted, treat -n and -e as Bash and common Linux conveniences, inspect $? immediately, and switch to printf, cat, or sudo tee when exact formatting, file content, option-like text, or privileged writes matter.

Share this guide

Help another Linux user troubleshoot faster

Share this guide with someone troubleshooting Linux systems or saving it for later.

Follow LinuxCapable

Want more LinuxCapable guides in Google?

Add LinuxCapable as a preferred source so Google can show more of our fresh Linux tutorials in Top Stories and From your sources when relevant.

Add LinuxCapable as a preferred source on Google
Search LinuxCapable

Need another guide?

Search LinuxCapable for package installs, commands, troubleshooting, and follow-up guides related to what you just read.

Found this guide useful?

Support LinuxCapable to keep tutorials free and up to date.

Buy me a coffeeBuy me a coffee
Before commenting, please review our Comments Policy.
Formatting tips for your comment

You can use basic HTML to format your comment. Useful tags currently allowed in published comments:

You type Result
<code>command</code> command
<strong>bold</strong> bold
<em>italic</em> italic
<a href="https://example.com">link</a> link
<blockquote>quote</blockquote> quote block

Got a Question or Feedback?

We read and reply to every comment - let us know how we can help or improve this guide.

Verify before posting: