📄 escapingsection.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><TITLE>Escaping</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+"><LINKREL="HOME"TITLE="Advanced Bash-Scripting Guide"HREF="index.html"><LINKREL="UP"TITLE="Quoting"HREF="quoting.html"><LINKREL="PREVIOUS"TITLE="Quoting"HREF="quoting.html"><LINKREL="NEXT"TITLE="Exit and Exit Status"HREF="exit-status.html"><METAHTTP-EQUIV="Content-Style-Type"CONTENT="text/css"><LINKREL="stylesheet"HREF="common/kde-common.css"TYPE="text/css"><METAHTTP-EQUIV="Content-Type"CONTENT="text/html; charset=iso-8859-1"><METAHTTP-EQUIV="Content-Language"CONTENT="en"><LINKREL="stylesheet"HREF="common/kde-localised.css"TYPE="text/css"TITLE="KDE-English"><LINKREL="stylesheet"HREF="common/kde-default.css"TYPE="text/css"TITLE="KDE-Default"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#AA0000"VLINK="#AA0055"ALINK="#AA0000"STYLE="font-family: sans-serif;"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="quoting.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">Chapter 5. Quoting</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="exit-status.html"ACCESSKEY="N">Next</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="ESCAPINGSECTION"></A>5.2. Escaping</H1><P><ANAME="ESCP"></A><ICLASS="FIRSTTERM">Escaping</I> is a method of quoting single characters. The <SPANCLASS="TOKEN">escape</SPAN> (<SPANCLASS="TOKEN">\</SPAN>) preceding a character tells the shell to interpret that character literally.</P><DIVCLASS="CAUTION"><TABLECLASS="CAUTION"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/caution.png"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>With certain commands and utilities, such as <AHREF="internal.html#ECHOREF">echo</A> and <AHREF="sedawk.html#SEDREF">sed</A>, escaping a character may have the opposite effect - it can toggle on a special meaning for that character.</P></TD></TR></TABLE></DIV><DIVCLASS="VARIABLELIST"><P><B><ANAME="SPM"></A>Special meanings of certain escaped characters</B></P><DL><DT>used with <BCLASS="COMMAND">echo</B> and <BCLASS="COMMAND">sed</B></DT><DD><P></P></DD><DT><SPANCLASS="TOKEN">\n</SPAN></DT><DD><P>means newline</P></DD><DT><SPANCLASS="TOKEN">\r</SPAN></DT><DD><P>means return</P></DD><DT><SPANCLASS="TOKEN">\t</SPAN></DT><DD><P>means tab</P></DD><DT><SPANCLASS="TOKEN">\v</SPAN></DT><DD><P> means vertical tab</P></DD><DT><SPANCLASS="TOKEN">\b</SPAN></DT><DD><P>means backspace</P></DD><DT><SPANCLASS="TOKEN">\a</SPAN></DT><DD><P>means <SPANCLASS="QUOTE">"alert"</SPAN> (beep or flash)</P></DD><DT><SPANCLASS="TOKEN">\0xx</SPAN></DT><DD><P>translates to the octal ASCII equivalent of <TTCLASS="REPLACEABLE"><I>0xx</I></TT></P><DIVCLASS="EXAMPLE"><HR><ANAME="ESCAPED"></A><P><B>Example 5-2. Escaped Characters</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # escaped.sh: escaped characters 3 4 echo; echo 5 6 # Escaping a newline. 7 # ------------------ 8 9 echo "" 10 11 echo "This will print 12 as two lines." 13 # This will print 14 # as two lines. 15 16 echo "This will print \ 17 as one line." 18 # This will print as one line. 19 20 echo; echo 21 22 echo "=============" 23 24 25 echo "\v\v\v\v" # Prints \v\v\v\v literally. 26 # Use the -e option with 'echo' to print escaped characters. 27 echo "=============" 28 echo "VERTICAL TABS" 29 echo -e "\v\v\v\v" # Prints 4 vertical tabs. 30 echo "==============" 31 32 echo "QUOTATION MARK" 33 echo -e "\042" # Prints " (quote, octal ASCII character 42). 34 echo "==============" 35 36 # The $'\X' construct makes the -e option unnecessary. 37 echo; echo "NEWLINE AND BEEP" 38 echo $'\n' # Newline. 39 echo $'\a' # Alert (beep). 40 41 echo "===============" 42 echo "QUOTATION MARKS" 43 # Version 2 and later of Bash permits using the $'\nnn' construct. 44 # Note that in this case, '\nnn' is an octal value. 45 echo $'\t \042 \t' # Quote (") framed by tabs. 46 47 # It also works with hexadecimal values, in an $'\xhhh' construct. 48 echo $'\t \x22 \t' # Quote (") framed by tabs. 49 # Thank you, Greg Keraunen, for pointing this out. 50 # Earlier Bash versions allowed '\x022'. 51 echo "===============" 52 echo 53 54 55 56 57 58 # Assigning ASCII characters to a variable. 59 # ---------------------------------------- 60 quote=$'\042' # " assigned to a variable. 61 echo "$quote This is a quoted string, $quote and this lies outside the quotes." 62 63 echo 64 65 # Concatenating ASCII chars in a variable. 66 triple_underline=$'\137\137\137' # 137 is octal ASCII code for '_'. 67 echo "$triple_underline UNDERLINE $triple_underline" 68 69 echo 70 71 ABC=$'\101\102\103\010' # 101, 102, 103 are octal A, B, C. 72 echo $ABC 73 74 echo; echo 75 76 escape=$'\033' # 033 is octal for escape. 77 echo "\"escape\" echoes as $escape" 78 # no visible output. 79 80 echo; echo 81 82 exit 0</PRE></TD></TR></TABLE><HR></DIV><P>See <AHREF="bash2.html#EX77">Example 34-1</A> for another example of the <TTCLASS="USERINPUT"><B>$' '</B></TT> string expansion construct.</P></DD><DT><SPANCLASS="TOKEN">\"</SPAN></DT><DD><P> gives the quote its literal meaning</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 echo "Hello" # Hello 2 echo "\"Hello\", he said." # "Hello", he said.</PRE></TD></TR></TABLE></P></DD><DT><SPANCLASS="TOKEN">\$</SPAN></DT><DD><P>gives the dollar sign its literal meaning (variable name following <SPANCLASS="TOKEN">\$</SPAN> will not be referenced)</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 echo "\$variable01" # results in $variable01</PRE></TD></TR></TABLE></P></DD><DT><SPANCLASS="TOKEN">\\</SPAN></DT><DD><P>gives the backslash its literal meaning</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 echo "\\" # Results in \ 2 3 # Whereas . . . 4 5 echo "\" # Invokes secondary prompt from the command line. 6 # In a script, gives an error message.</PRE></TD></TR></TABLE></P></DD></DL></DIV><DIVCLASS="NOTE"><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/note.png"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>The behavior of <SPANCLASS="TOKEN">\</SPAN> depends on whether it is itself escaped, quoted, or appearing within <AHREF="commandsub.html#COMMANDSUBREF">command substitution</A> or a <AHREF="here-docs.html#HEREDOCREF">here document</A>. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 # Simple escaping and quoting 2 echo \z # z 3 echo \\z # \z 4 echo '\z' # \z 5 echo '\\z' # \\z 6 echo "\z" # \z 7 echo "\\z" # \z 8 9 # Command substitution 10 echo `echo \z` # z 11 echo `echo \\z` # z 12 echo `echo \\\z` # \z 13 echo `echo \\\\z` # \z 14 echo `echo \\\\\\z` # \z 15 echo `echo \\\\\\\z` # \\z 16 echo `echo "\z"` # \z 17 echo `echo "\\z"` # \z 18 19 # Here document 20 cat <<EOF 21 \z 22 EOF # \z 23 24 cat <<EOF 25 \\z 26 EOF # \z 27 28 # These examples supplied by St閜hane Chazelas.</PRE></TD></TR></TABLE> </P><P>Elements of a string assigned to a variable may be escaped, but the escape character alone may not be assigned to a variable. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 variable=\ 2 echo "$variable" 3 # Will not work - gives an error message: 4 # test.sh: : command not found 5 # A "naked" escape cannot safely be assigned to a variable. 6 # 7 # What actually happens here is that the "\" escapes the newline and 8 #+ the effect is variable=echo "$variable" 9 #+ invalid variable assignment 10 11 variable=\ 12 23skidoo 13 echo "$variable" # 23skidoo 14 # This works, since the second line 15 #+ is a valid variable assignment. 16 17 variable=\ 18 # \^ escape followed by space 19 echo "$variable" # space 20 21 variable=\\ 22 echo "$variable" # \ 23 24 variable=\\\ 25 echo "$variable" 26 # Will not work - gives an error message: 27 # test.sh: \: command not found 28 # 29 # First escape escapes second one, but the third one is left "naked", 30 #+ with same result as first instance, above. 31 32 variable=\\\\ 33 echo "$variable" # \\ 34 # Second and fourth escapes escaped. 35 # This is o.k.</PRE></TD></TR></TABLE> </P></TD></TR></TABLE></DIV><P>Escaping a space can prevent word splitting in a command's argument list. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7" 2 # List of files as argument(s) to a command. 3 4 # Add two files to the list, and list all. 5 ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list 6 7 echo "-------------------------------------------------------------------------" 8 9 # What happens if we escape a couple of spaces? 10 ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list 11 # Error: the first three files concatenated into a single argument to 'ls -l' 12 # because the two escaped spaces prevent argument (word) splitting.</PRE></TD></TR></TABLE></P><P><ANAME="ESCNEWLINE"></A></P><P>The <SPANCLASS="TOKEN">escape</SPAN> also provides a means of writing a multi-line command. Normally, each separate line constitutes a different command, but an <SPANCLASS="TOKEN">escape</SPAN> at the end of a line <SPANCLASS="emphasis"><ICLASS="EMPHASIS">escapes the newline character</I></SPAN>, and the command sequence continues on to the next line.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 (cd /source/directory && tar cf - . ) | \ 2 (cd /dest/directory && tar xpvf -) 3 # Repeating Alan Cox's directory tree copy command, 4 # but split into two lines for increased legibility. 5 6 # As an alternative: 7 tar cf - -C /source/directory . | 8 tar xpvf - -C /dest/directory 9 # See note below. 10 # (Thanks, St閜hane Chazelas.)</PRE></TD></TR></TABLE> <DIVCLASS="NOTE"><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/note.png"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>If a script line ends with a <SPANCLASS="TOKEN">|</SPAN>, a pipe character, then a <SPANCLASS="TOKEN">\</SPAN>, 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.</P></TD></TR></TABLE></DIV></P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 echo "foo 2 bar" 3 #foo 4 #bar 5 6 echo 7 8 echo 'foo 9 bar' # No difference yet. 10 #foo 11 #bar 12 13 echo 14 15 echo foo\ 16 bar # Newline escaped. 17 #foobar 18 19 echo 20 21 echo "foo\ 22 bar" # Same here, as \ still interpreted as escape within weak quotes. 23 #foobar 24 25 echo 26 27 echo 'foo\ 28 bar' # Escape character \ taken literally because of strong quoting. 29 #foo\ 30 #bar 31 32 # Examples suggested by St閜hane Chazelas.</PRE></TD></TR></TABLE></P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="quoting.html"ACCESSKEY="P">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="exit-status.html"ACCESSKEY="N">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Quoting</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="quoting.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Exit and Exit Status</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -