749 lines
10 KiB
HTML
749 lines
10 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||
<HTML
|
||
><HEAD
|
||
><TITLE
|
||
>Quoting Variables</TITLE
|
||
><META
|
||
NAME="GENERATOR"
|
||
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
|
||
REL="HOME"
|
||
TITLE="Advanced Bash-Scripting Guide"
|
||
HREF="index.html"><LINK
|
||
REL="UP"
|
||
TITLE="Quoting"
|
||
HREF="quoting.html"><LINK
|
||
REL="PREVIOUS"
|
||
TITLE="Quoting"
|
||
HREF="quoting.html"><LINK
|
||
REL="NEXT"
|
||
TITLE="Escaping"
|
||
HREF="escapingsection.html"></HEAD
|
||
><BODY
|
||
CLASS="SECT1"
|
||
BGCOLOR="#FFFFFF"
|
||
TEXT="#000000"
|
||
LINK="#0000FF"
|
||
VLINK="#840084"
|
||
ALINK="#0000FF"
|
||
><DIV
|
||
CLASS="NAVHEADER"
|
||
><TABLE
|
||
SUMMARY="Header navigation table"
|
||
WIDTH="100%"
|
||
BORDER="0"
|
||
CELLPADDING="0"
|
||
CELLSPACING="0"
|
||
><TR
|
||
><TH
|
||
COLSPAN="3"
|
||
ALIGN="center"
|
||
>Advanced Bash-Scripting Guide: </TH
|
||
></TR
|
||
><TR
|
||
><TD
|
||
WIDTH="10%"
|
||
ALIGN="left"
|
||
VALIGN="bottom"
|
||
><A
|
||
HREF="quoting.html"
|
||
ACCESSKEY="P"
|
||
>Prev</A
|
||
></TD
|
||
><TD
|
||
WIDTH="80%"
|
||
ALIGN="center"
|
||
VALIGN="bottom"
|
||
>Chapter 5. Quoting</TD
|
||
><TD
|
||
WIDTH="10%"
|
||
ALIGN="right"
|
||
VALIGN="bottom"
|
||
><A
|
||
HREF="escapingsection.html"
|
||
ACCESSKEY="N"
|
||
>Next</A
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
><HR
|
||
ALIGN="LEFT"
|
||
WIDTH="100%"></DIV
|
||
><DIV
|
||
CLASS="SECT1"
|
||
><H1
|
||
CLASS="SECT1"
|
||
><A
|
||
NAME="QUOTINGVAR"
|
||
></A
|
||
>5.1. Quoting Variables</H1
|
||
><P
|
||
>When referencing a variable, it is generally advisable to
|
||
enclose its name in double quotes.
|
||
This prevents reinterpretation of all special characters within
|
||
the quoted string -- except <SPAN
|
||
CLASS="TOKEN"
|
||
>$</SPAN
|
||
>, <SPAN
|
||
CLASS="TOKEN"
|
||
>`</SPAN
|
||
>
|
||
(backquote), and <SPAN
|
||
CLASS="TOKEN"
|
||
>\</SPAN
|
||
> (escape).
|
||
|
||
<A
|
||
NAME="AEN2630"
|
||
HREF="#FTN.AEN2630"
|
||
><SPAN
|
||
CLASS="footnote"
|
||
>[1]</SPAN
|
||
></A
|
||
>
|
||
|
||
Keeping <SPAN
|
||
CLASS="TOKEN"
|
||
>$</SPAN
|
||
> as a special character within
|
||
double quotes permits referencing a quoted variable
|
||
(<TT
|
||
CLASS="REPLACEABLE"
|
||
><I
|
||
>"$variable"</I
|
||
></TT
|
||
>), that is, replacing the
|
||
variable with its value (see <A
|
||
HREF="varsubn.html#EX9"
|
||
>Example 4-1</A
|
||
>, above).</P
|
||
><P
|
||
><A
|
||
NAME="WSQUO"
|
||
></A
|
||
></P
|
||
><P
|
||
>Use double quotes to prevent word splitting.
|
||
|
||
<A
|
||
NAME="AEN2688"
|
||
HREF="#FTN.AEN2688"
|
||
><SPAN
|
||
CLASS="footnote"
|
||
>[2]</SPAN
|
||
></A
|
||
>
|
||
|
||
An argument enclosed in double quotes presents
|
||
itself as a single word, even if it contains <A
|
||
HREF="special-chars.html#WHITESPACEREF"
|
||
>whitespace</A
|
||
> separators.</P
|
||
><P
|
||
><A
|
||
NAME="VARSPLITTING"
|
||
></A
|
||
></P
|
||
><P
|
||
><TABLE
|
||
BORDER="0"
|
||
BGCOLOR="#E0E0E0"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
><FONT
|
||
COLOR="#000000"
|
||
><PRE
|
||
CLASS="PROGRAMLISTING"
|
||
>List="one two three"
|
||
|
||
for a in $List # Splits the variable in parts at whitespace.
|
||
do
|
||
echo "$a"
|
||
done
|
||
# one
|
||
# two
|
||
# three
|
||
|
||
echo "---"
|
||
|
||
for a in "$List" # Preserves whitespace in a single variable.
|
||
do # ^ ^
|
||
echo "$a"
|
||
done
|
||
# one two three</PRE
|
||
></FONT
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
></P
|
||
><P
|
||
>A more elaborate example:</P
|
||
><P
|
||
><TABLE
|
||
BORDER="0"
|
||
BGCOLOR="#E0E0E0"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
><FONT
|
||
COLOR="#000000"
|
||
><PRE
|
||
CLASS="PROGRAMLISTING"
|
||
>variable1="a variable containing five words"
|
||
COMMAND This is $variable1 # Executes COMMAND with 7 arguments:
|
||
# "This" "is" "a" "variable" "containing" "five" "words"
|
||
|
||
COMMAND "This is $variable1" # Executes COMMAND with 1 argument:
|
||
# "This is a variable containing five words"
|
||
|
||
|
||
variable2="" # Empty.
|
||
|
||
COMMAND $variable2 $variable2 $variable2
|
||
# Executes COMMAND with no arguments.
|
||
COMMAND "$variable2" "$variable2" "$variable2"
|
||
# Executes COMMAND with 3 empty arguments.
|
||
COMMAND "$variable2 $variable2 $variable2"
|
||
# Executes COMMAND with 1 argument (2 spaces).
|
||
|
||
# Thanks, St<53>phane Chazelas.</PRE
|
||
></FONT
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
></P
|
||
><DIV
|
||
CLASS="TIP"
|
||
><P
|
||
></P
|
||
><TABLE
|
||
CLASS="TIP"
|
||
WIDTH="100%"
|
||
BORDER="0"
|
||
><TR
|
||
><TD
|
||
WIDTH="25"
|
||
ALIGN="CENTER"
|
||
VALIGN="TOP"
|
||
><IMG
|
||
SRC="../images/tip.gif"
|
||
HSPACE="5"
|
||
ALT="Tip"></TD
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
><P
|
||
>Enclosing the arguments to an <B
|
||
CLASS="COMMAND"
|
||
>echo</B
|
||
>
|
||
statement in double quotes is necessary only when word splitting
|
||
or preservation of <A
|
||
HREF="special-chars.html#WHITESPACEREF"
|
||
>whitespace</A
|
||
>
|
||
is an issue.</P
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
></DIV
|
||
><DIV
|
||
CLASS="EXAMPLE"
|
||
><A
|
||
NAME="WEIRDVARS"
|
||
></A
|
||
><P
|
||
><B
|
||
>Example 5-1. Echoing Weird Variables</B
|
||
></P
|
||
><TABLE
|
||
BORDER="0"
|
||
BGCOLOR="#E0E0E0"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
><FONT
|
||
COLOR="#000000"
|
||
><PRE
|
||
CLASS="PROGRAMLISTING"
|
||
>#!/bin/bash
|
||
# weirdvars.sh: Echoing weird variables.
|
||
|
||
echo
|
||
|
||
var="'(]\\{}\$\""
|
||
echo $var # '(]\{}$"
|
||
echo "$var" # '(]\{}$" Doesn't make a difference.
|
||
|
||
echo
|
||
|
||
IFS='\'
|
||
echo $var # '(] {}$" \ converted to space. Why?
|
||
echo "$var" # '(]\{}$"
|
||
|
||
# Examples above supplied by Stephane Chazelas.
|
||
|
||
echo
|
||
|
||
var2="\\\\\""
|
||
echo $var2 # "
|
||
echo "$var2" # \\"
|
||
echo
|
||
# But ... var2="\\\\"" is illegal. Why?
|
||
var3='\\\\'
|
||
echo "$var3" # \\\\
|
||
# Strong quoting works, though.
|
||
|
||
|
||
# ************************************************************ #
|
||
# As the first example above shows, nesting quotes is permitted.
|
||
|
||
echo "$(echo '"')" # "
|
||
# ^ ^
|
||
|
||
|
||
# At times this comes in useful.
|
||
|
||
var1="Two bits"
|
||
echo "\$var1 = "$var1"" # $var1 = Two bits
|
||
# ^ ^
|
||
|
||
# Or, as Chris Hiestand points out ...
|
||
|
||
if [[ "$(du "$My_File1")" -gt "$(du "$My_File2")" ]]
|
||
# ^ ^ ^ ^ ^ ^ ^ ^
|
||
then
|
||
...
|
||
fi
|
||
# ************************************************************ #</PRE
|
||
></FONT
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
></DIV
|
||
><P
|
||
>Single quotes (<SPAN
|
||
CLASS="TOKEN"
|
||
>' '</SPAN
|
||
>) operate similarly to double
|
||
quotes, but do not permit referencing variables, since
|
||
the special meaning of <SPAN
|
||
CLASS="TOKEN"
|
||
>$</SPAN
|
||
> is turned off.
|
||
Within single quotes, <EM
|
||
>every</EM
|
||
> special
|
||
character except <SPAN
|
||
CLASS="TOKEN"
|
||
>'</SPAN
|
||
> gets interpreted literally.
|
||
Consider single quotes (<SPAN
|
||
CLASS="QUOTE"
|
||
>"full quoting"</SPAN
|
||
>) to be a
|
||
stricter method of quoting than double quotes (<SPAN
|
||
CLASS="QUOTE"
|
||
>"partial
|
||
quoting"</SPAN
|
||
>).</P
|
||
><DIV
|
||
CLASS="NOTE"
|
||
><P
|
||
></P
|
||
><TABLE
|
||
CLASS="NOTE"
|
||
WIDTH="100%"
|
||
BORDER="0"
|
||
><TR
|
||
><TD
|
||
WIDTH="25"
|
||
ALIGN="CENTER"
|
||
VALIGN="TOP"
|
||
><IMG
|
||
SRC="../images/note.gif"
|
||
HSPACE="5"
|
||
ALT="Note"></TD
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
><P
|
||
>Since even the escape character (<SPAN
|
||
CLASS="TOKEN"
|
||
>\</SPAN
|
||
>)
|
||
gets a literal interpretation within single quotes, trying to
|
||
enclose a single quote within single quotes will not yield the
|
||
expected result.
|
||
<TABLE
|
||
BORDER="0"
|
||
BGCOLOR="#E0E0E0"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
><FONT
|
||
COLOR="#000000"
|
||
><PRE
|
||
CLASS="PROGRAMLISTING"
|
||
>echo "Why can't I write 's between single quotes"
|
||
|
||
echo
|
||
|
||
# The roundabout method.
|
||
echo 'Why can'\''t I write '"'"'s between single quotes'
|
||
# |-------| |----------| |-----------------------|
|
||
# Three single-quoted strings, with escaped and quoted single quotes between.
|
||
|
||
# This example courtesy of St<53>phane Chazelas.</PRE
|
||
></FONT
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
>
|
||
</P
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
></DIV
|
||
></DIV
|
||
><H3
|
||
CLASS="FOOTNOTES"
|
||
>Notes</H3
|
||
><TABLE
|
||
BORDER="0"
|
||
CLASS="FOOTNOTES"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
WIDTH="5%"
|
||
><A
|
||
NAME="FTN.AEN2630"
|
||
HREF="quotingvar.html#AEN2630"
|
||
><SPAN
|
||
CLASS="footnote"
|
||
>[1]</SPAN
|
||
></A
|
||
></TD
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
WIDTH="95%"
|
||
><P
|
||
><A
|
||
NAME="QUOTINGBSL"
|
||
></A
|
||
></P
|
||
><P
|
||
>Encapsulating <SPAN
|
||
CLASS="QUOTE"
|
||
>"!"</SPAN
|
||
> within double
|
||
quotes gives an error when used <EM
|
||
>from the command
|
||
line</EM
|
||
>. This is interpreted as a <A
|
||
HREF="histcommands.html"
|
||
>history command</A
|
||
>. Within a script,
|
||
though, this problem does not occur, since the Bash history
|
||
mechanism is disabled then.</P
|
||
><P
|
||
>Of more concern is the <EM
|
||
>apparently</EM
|
||
>
|
||
inconsistent behavior of <TT
|
||
CLASS="REPLACEABLE"
|
||
><I
|
||
>\</I
|
||
></TT
|
||
>
|
||
within double quotes, and especially following an
|
||
<B
|
||
CLASS="COMMAND"
|
||
>echo -e</B
|
||
> command.</P
|
||
><P
|
||
> <TABLE
|
||
BORDER="1"
|
||
BGCOLOR="#E0E0E0"
|
||
WIDTH="100%"
|
||
><TR
|
||
><TD
|
||
><FONT
|
||
COLOR="#000000"
|
||
><PRE
|
||
CLASS="SCREEN"
|
||
><TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo hello\!</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>hello!</TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo "hello\!"</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>hello\!</TT
|
||
>
|
||
|
||
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo \</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>></TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo "\"</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>></TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo \a</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>a</TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo "\a"</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>\a</TT
|
||
>
|
||
|
||
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo x\ty</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>xty</TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo "x\ty"</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>x\ty</TT
|
||
>
|
||
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo -e x\ty</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>xty</TT
|
||
>
|
||
<TT
|
||
CLASS="PROMPT"
|
||
>bash$ </TT
|
||
><TT
|
||
CLASS="USERINPUT"
|
||
><B
|
||
>echo -e "x\ty"</B
|
||
></TT
|
||
>
|
||
<TT
|
||
CLASS="COMPUTEROUTPUT"
|
||
>x y</TT
|
||
>
|
||
</PRE
|
||
></FONT
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
>
|
||
</P
|
||
><P
|
||
>Double quotes following an <I
|
||
CLASS="FIRSTTERM"
|
||
>echo</I
|
||
>
|
||
<EM
|
||
>sometimes</EM
|
||
> escape
|
||
<TT
|
||
CLASS="REPLACEABLE"
|
||
><I
|
||
>\</I
|
||
></TT
|
||
>. Moreover, the
|
||
<TT
|
||
CLASS="OPTION"
|
||
>-e</TT
|
||
> option to <I
|
||
CLASS="FIRSTTERM"
|
||
>echo</I
|
||
>
|
||
causes the <SPAN
|
||
CLASS="QUOTE"
|
||
>"\t"</SPAN
|
||
> to be interpreted as a
|
||
<I
|
||
CLASS="FIRSTTERM"
|
||
>tab</I
|
||
>.</P
|
||
><P
|
||
>(Thank you, Wayne Pollock, for pointing this out, and Geoff
|
||
Lee and Daniel Barclay for explaining it.) </P
|
||
></TD
|
||
></TR
|
||
><TR
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
WIDTH="5%"
|
||
><A
|
||
NAME="FTN.AEN2688"
|
||
HREF="quotingvar.html#AEN2688"
|
||
><SPAN
|
||
CLASS="footnote"
|
||
>[2]</SPAN
|
||
></A
|
||
></TD
|
||
><TD
|
||
ALIGN="LEFT"
|
||
VALIGN="TOP"
|
||
WIDTH="95%"
|
||
><P
|
||
><A
|
||
NAME="WSPLITREF"
|
||
></A
|
||
><SPAN
|
||
CLASS="QUOTE"
|
||
>"Word
|
||
splitting,"</SPAN
|
||
> in this context, means dividing
|
||
a character string into separate and discrete
|
||
arguments.</P
|
||
></TD
|
||
></TR
|
||
></TABLE
|
||
><DIV
|
||
CLASS="NAVFOOTER"
|
||
><HR
|
||
ALIGN="LEFT"
|
||
WIDTH="100%"><TABLE
|
||
SUMMARY="Footer navigation table"
|
||
WIDTH="100%"
|
||
BORDER="0"
|
||
CELLPADDING="0"
|
||
CELLSPACING="0"
|
||
><TR
|
||
><TD
|
||
WIDTH="33%"
|
||
ALIGN="left"
|
||
VALIGN="top"
|
||
><A
|
||
HREF="quoting.html"
|
||
ACCESSKEY="P"
|
||
>Prev</A
|
||
></TD
|
||
><TD
|
||
WIDTH="34%"
|
||
ALIGN="center"
|
||
VALIGN="top"
|
||
><A
|
||
HREF="index.html"
|
||
ACCESSKEY="H"
|
||
>Home</A
|
||
></TD
|
||
><TD
|
||
WIDTH="33%"
|
||
ALIGN="right"
|
||
VALIGN="top"
|
||
><A
|
||
HREF="escapingsection.html"
|
||
ACCESSKEY="N"
|
||
>Next</A
|
||
></TD
|
||
></TR
|
||
><TR
|
||
><TD
|
||
WIDTH="33%"
|
||
ALIGN="left"
|
||
VALIGN="top"
|
||
>Quoting</TD
|
||
><TD
|
||
WIDTH="34%"
|
||
ALIGN="center"
|
||
VALIGN="top"
|
||
><A
|
||
HREF="quoting.html"
|
||
ACCESSKEY="U"
|
||
>Up</A
|
||
></TD
|
||
><TD
|
||
WIDTH="33%"
|
||
ALIGN="right"
|
||
VALIGN="top"
|
||
>Escaping</TD
|
||
></TR
|
||
></TABLE
|
||
></DIV
|
||
></BODY
|
||
></HTML
|
||
> |