Escaping is a method
of quoting single characters. The escape
(\) preceding a character tells the shell to
interpret that character literally.
With certain commands and utilities, such as echo and sed, escaping a character may have the
opposite effect - it can toggle on a special meaning for that
Special meanings of certain
used with echo and
means vertical tab
means "alert" (beep or flash)
translates to the octal ASCII
equivalent of 0xx
Example 5-2. Escaped Characters
# escaped.sh: escaped characters
echo "\v\v\v\v" # Prints \v\v\v\v literally.
# Use the -e option with 'echo' to print escaped characters.
echo "VERTICAL TABS"
echo -e "\v\v\v\v" # Prints 4 vertical tabs.
echo "QUOTATION MARK"
echo -e "\042" # Prints " (quote, octal ASCII character 42).
# The $'\X' construct makes the -e option unnecessary.
echo; echo "NEWLINE AND BEEP"
echo $'\n' # Newline.
echo $'\a' # Alert (beep).
echo "QUOTATION MARKS"
# Version 2 and later of Bash permits using the $'\nnn' construct.
# Note that in this case, '\nnn' is an octal value.
echo $'\t \042 \t' # Quote (") framed by tabs.
# It also works with hexadecimal values, in an $'\xhhh' construct.
echo $'\t \x22 \t' # Quote (") framed by tabs.
# Thank you, Greg Keraunen, for pointing this out.
# Earlier Bash versions allowed '\x022'.
# Assigning ASCII characters to a variable.
quote=$'\042' # " assigned to a variable.
echo "$quote This is a quoted string, $quote and this lies outside the quotes."
# Concatenating ASCII chars in a variable.
triple_underline=$'\137\137\137' # 137 is octal ASCII code for '_'.
echo "$triple_underline UNDERLINE $triple_underline"
ABC=$'\101\102\103\010' # 101, 102, 103 are octal A, B, C.
escape=$'\033' # 033 is octal for escape.
echo "\"escape\" echoes as $escape"
# no visible output.
See Example 34-1 for another example of the
$' ' string expansion
gives the quote its literal meaning
echo "Hello" # Hello
echo "\"Hello\", he said." # "Hello", he said.
gives the dollar sign its literal meaning
(variable name following \$ will not be
echo "\$variable01" # results in $variable01
gives the backslash its literal meaning
echo "\\" # Results in \
# Whereas . . .
echo "\" # Invokes secondary prompt from the command line.
# In a script, gives an error message.
Elements of a string assigned to a variable may be escaped, but
the escape character alone may not be assigned to a variable.
# Will not work - gives an error message:
# test.sh: : command not found
# A "naked" escape cannot safely be assigned to a variable.
# What actually happens here is that the "\" escapes the newline and
#+ the effect is variable=echo "$variable"
#+ invalid variable assignment
echo "$variable" # 23skidoo
# This works, since the second line
#+ is a valid variable assignment.
# \^ escape followed by space
echo "$variable" # space
echo "$variable" # \
# Will not work - gives an error message:
# test.sh: \: command not found
# First escape escapes second one, but the third one is left "naked",
#+ with same result as first instance, above.
echo "$variable" # \\
# Second and fourth escapes escaped.
# This is o.k.
Escaping a space can prevent word splitting in a command's argument list.
file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"
# List of files as argument(s) to a command.
# Add two files to the list, and list all.
ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list
# What happens if we escape a couple of spaces?
ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
# Error: the first three files concatenated into a single argument to 'ls -l'
# because the two escaped spaces prevent argument (word) splitting.
The escape also provides a means of writing a
multi-line command. Normally, each separate line constitutes
a different command, but an escape at the end
of a line escapes the newline character,
and the command sequence continues on to the next line.
(cd /source/directory && tar cf - . ) | \
(cd /dest/directory && tar xpvf -)
# Repeating Alan Cox's directory tree copy command,
# but split into two lines for increased legibility.
# As an alternative:
tar cf - -C /source/directory . |
tar xpvf - -C /dest/directory
# See note below.
# (Thanks, St�phane Chazelas.)
If a script line ends with a |, a pipe
character, then a \, an escape, is not strictly
necessary. It is, however, good programming practice to always
escape the end of a line of code that continues to the
bar' # No difference yet.
bar # Newline escaped.
bar" # Same here, as \ still interpreted as escape within weak quotes.
bar' # Escape character \ taken literally because of strong quoting.
# Examples suggested by St�phane Chazelas.