Библиотека сайта rus-linux.net
5.2. Escaping
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 character. |
Special meanings of certain escaped characters
- used with echo and sed
- \n
means newline
- \r
means return
- \t
means tab
- \v
means vertical tab
- \b
means backspace
- \a
means alert (beep or flash)
- \0xx
translates to the octal ASCII equivalent of
0nn
, wherenn
is a string of digitsExample 5-2. Escaped Characters
#!/bin/bash # escaped.sh: escaped characters echo; echo # Escaping a newline. # ------------------ echo "" echo "This will print as two lines." # This will print # as two lines. echo "This will print \ as one line." # This will print as one line. echo; echo echo "=============" echo "\v\v\v\v" # Prints \v\v\v\v literally. # Use the -e option with 'echo' to print escaped characters. echo "=============" echo "VERTICAL TABS" echo -e "\v\v\v\v" # Prints 4 vertical tabs. echo "==============" echo "QUOTATION MARK" echo -e "\042" # Prints " (quote, octal ASCII character 42). echo "==============" # The $'\X' construct makes the -e option unnecessary. echo; echo "NEWLINE AND BEEP" echo $'\n' # Newline. echo $'\a' # Alert (beep). echo "===============" 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'. echo "===============" echo # 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." echo # Concatenating ASCII chars in a variable. triple_underline=$'\137\137\137' # 137 is octal ASCII code for '_'. echo "$triple_underline UNDERLINE $triple_underline" echo ABC=$'\101\102\103\010' # 101, 102, 103 are octal A, B, C. echo $ABC echo; echo escape=$'\033' # 033 is octal for escape. echo "\"escape\" echoes as $escape" # no visible output. echo; echo exit 0
See Example 36-1 for another example of the
$' ... '
string-expansion construct.- \"
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 referenced)
echo "\$variable01" # $variable01 echo "The book cost \$7.98." # The book cost $7.98.
- \\
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. # However . . . echo '\' # Results in \
The behavior of \ depends on whether
it is escaped, strong-quoted,
weak-quoted, or appearing within
command substitution or a
here document.
Elements of a string assigned to a variable may be escaped, but
the escape character alone may not be assigned to a variable.
|
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 echo "-------------------------------------------------------------------------" # 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 following line. |
echo "foo bar" #foo #bar echo echo 'foo bar' # No difference yet. #foo #bar echo echo foo\ bar # Newline escaped. #foobar echo echo "foo\ bar" # Same here, as \ still interpreted as escape within weak quotes. #foobar echo echo 'foo\ bar' # Escape character \ taken literally because of strong quoting. #foo\ #bar # Examples suggested by StИphane Chazelas. |