📄 variables2.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><TITLE>Variables Revisited</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINKREL="HOME"TITLE="Advanced Bash-Scripting Guide"HREF="index.html"><LINKREL="UP"TITLE="Beyond the Basics"HREF="part3.html"><LINKREL="PREVIOUS"TITLE="Beyond the Basics"HREF="part3.html"><LINKREL="NEXT"TITLE="Manipulating Strings"HREF="string-manipulation.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="CHAPTER"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#AA0000"VLINK="#AA0055"ALINK="#AA0000"STYLE="font-family: sans-serif;"><DIVCLASS="NAVHEADER"><TABLEWIDTH="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="part3.html">Prev</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="string-manipulation.html">Next</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="CHAPTER"><H1><ANAME="VARIABLES2">Chapter 9. Variables Revisited</A></H1><P>Used properly, variables can add power and flexibility to scripts. This requires learning their subtleties and nuances.</P><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="INTERNALVARIABLES">9.1. Internal Variables</A></H1><DIVCLASS="VARIABLELIST"><DL><DT><TTCLASS="REPLACEABLE"><I><AHREF="internal.html#BUILTINREF">Builtin</A> variables</I></TT></DT><DD><P>variables affecting bash script behavior</P></DD><DT><TTCLASS="VARNAME">$BASH</TT></DT><DD><P>the path to the <ICLASS="EMPHASIS">Bash</I> binary itself <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">bash$ </TT><TTCLASS="USERINPUT"><B>echo $BASH</B></TT> <TTCLASS="COMPUTEROUTPUT">/bin/bash</TT></PRE></TD></TR></TABLE> </P></DD><DT><TTCLASS="VARNAME">$BASH_ENV</TT></DT><DD><P>an <AHREF="othertypesv.html#ENVREF">environmental variable</A> pointing to a Bash startup file to be read when a script is invoked</P></DD><DT><ANAME="BASHSUBSHELLREF"></A><TTCLASS="VARNAME">$BASH_SUBSHELL</TT></DT><DD><P>a variable indicating the <AHREF="subshells.html#SUBSHELLSREF">subshell</A> level. This is a new addition to Bash, <AHREF="bashver3.html#BASH3REF">version 3</A>.</P><P>See <AHREF="subshells.html#SUBSHELL">Example 20-1</A> for usage.</P></DD><DT><TTCLASS="VARNAME">$BASH_VERSINFO[n]</TT></DT><DD><P>a 6-element <AHREF="arrays.html#ARRAYREF">array</A> containing version information about the installed release of Bash. This is similar to <TTCLASS="VARNAME">$BASH_VERSION</TT>, below, but a bit more detailed.</P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 # Bash version info: 2 3 for n in 0 1 2 3 4 5 4 do 5 echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}" 6 done 7 8 # BASH_VERSINFO[0] = 3 # Major version no. 9 # BASH_VERSINFO[1] = 00 # Minor version no. 10 # BASH_VERSINFO[2] = 14 # Patch level. 11 # BASH_VERSINFO[3] = 1 # Build version. 12 # BASH_VERSINFO[4] = release # Release status. 13 # BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture 14 # (same as $MACHTYPE).</PRE></TD></TR></TABLE> </P></DD><DT><TTCLASS="VARNAME">$BASH_VERSION</TT></DT><DD><P>the version of Bash installed on the system</P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">bash$ </TT><TTCLASS="USERINPUT"><B>echo $BASH_VERSION</B></TT> <TTCLASS="COMPUTEROUTPUT">3.00.14(1)-release</TT> </PRE></TD></TR></TABLE> </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">tcsh% </TT><TTCLASS="USERINPUT"><B>echo $BASH_VERSION</B></TT> <TTCLASS="COMPUTEROUTPUT">BASH_VERSION: Undefined variable.</TT> </PRE></TD></TR></TABLE> </P><P>Checking $BASH_VERSION is a good method of determining which shell is running. <AHREF="variables2.html#SHELLVARREF">$SHELL</A> does not necessarily give the correct answer.</P></DD><DT><ANAME="DIRSTACKREF"></A><TTCLASS="VARNAME">$DIRSTACK</TT></DT><DD><P>the top value in the directory stack (affected by <AHREF="internal.html#PUSHDREF">pushd</A> and <AHREF="internal.html#POPDREF">popd</A>)</P><P>This builtin variable corresponds to the <AHREF="internal.html#DIRSD">dirs</A> command, however <BCLASS="COMMAND">dirs</B> shows the entire contents of the directory stack.</P></DD><DT><TTCLASS="VARNAME">$EDITOR</TT></DT><DD><P>the default editor invoked by a script, usually <BCLASS="COMMAND">vi</B> or <BCLASS="COMMAND">emacs</B>.</P></DD><DT><ANAME="EUIDREF"></A><TTCLASS="VARNAME">$EUID</TT></DT><DD><P><SPANCLASS="QUOTE">"effective"</SPAN> user ID number</P><P>Identification number of whatever identity the current user has assumed, perhaps by means of <AHREF="system.html#SUREF">su</A>.</P><DIVCLASS="CAUTION"><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/caution.png"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>The <TTCLASS="VARNAME">$EUID</TT> is not necessarily the same as the <AHREF="variables2.html#UIDREF">$UID</A>.</P></TD></TR></TABLE></DIV></DD><DT><TTCLASS="VARNAME">$FUNCNAME</TT></DT><DD><P>name of the current function</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 xyz23 () 2 { 3 echo "$FUNCNAME now executing." # xyz23 now executing. 4 } 5 6 xyz23 7 8 echo "FUNCNAME = $FUNCNAME" # FUNCNAME = 9 # Null value outside a function.</PRE></TD></TR></TABLE> </P></DD><DT><TTCLASS="VARNAME">$GLOBIGNORE</TT></DT><DD><P>A list of filename patterns to be excluded from matching in <AHREF="globbingref.html">globbing</A>.</P></DD><DT><ANAME="GROUPSREF"></A><TTCLASS="VARNAME">$GROUPS</TT></DT><DD><P>groups current user belongs to</P><P>This is a listing (array) of the group id numbers for current user, as recorded in <TTCLASS="FILENAME">/etc/passwd</TT>. </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">root# </TT><TTCLASS="USERINPUT"><B>echo $GROUPS</B></TT> <TTCLASS="COMPUTEROUTPUT">0</TT> <TTCLASS="PROMPT">root# </TT><TTCLASS="USERINPUT"><B>echo ${GROUPS[1]}</B></TT> <TTCLASS="COMPUTEROUTPUT">1</TT> <TTCLASS="PROMPT">root# </TT><TTCLASS="USERINPUT"><B>echo ${GROUPS[5]}</B></TT> <TTCLASS="COMPUTEROUTPUT">6</TT> </PRE></TD></TR></TABLE> </P></DD><DT><ANAME="HOMEDIRREF"></A><TTCLASS="VARNAME">$HOME</TT></DT><DD><P>home directory of the user, usually <TTCLASS="FILENAME">/home/username</TT> (see <AHREF="parameter-substitution.html#EX6">Example 9-14</A>)</P></DD><DT><ANAME="HOSTNAMEREF"></A><TTCLASS="VARNAME">$HOSTNAME</TT></DT><DD><P>The <AHREF="system.html#HNAMEREF">hostname</A> command assigns the system name at bootup in an init script. However, the <TTCLASS="FUNCTION">gethostname()</TT> function sets the Bash internal variable <TTCLASS="VARNAME">$HOSTNAME</TT>. See also <AHREF="parameter-substitution.html#EX6">Example 9-14</A>.</P></DD><DT><TTCLASS="VARNAME">$HOSTTYPE</TT></DT><DD><P>host type</P><P>Like <AHREF="variables2.html#MACHTYPEREF">$MACHTYPE</A>, identifies the system hardware.</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">bash$ </TT><TTCLASS="USERINPUT"><B>echo $HOSTTYPE</B></TT> <TTCLASS="COMPUTEROUTPUT">i686</TT></PRE></TD></TR></TABLE></DD><DT><ANAME="IFSREF"></A><TTCLASS="VARNAME">$IFS</TT></DT><DD><P>internal field separator</P><P>This variable determines how Bash recognizes fields, or word boundaries when it interprets character strings.</P><P>$IFS defaults to <AHREF="special-chars.html#WHITESPACEREF">whitespace</A> (space, tab, and newline), but may be changed, for example, to parse a comma-separated data file. Note that <AHREF="variables2.html#APPREF">$*</A> uses the first character held in <TTCLASS="VARNAME">$IFS</TT>. See <AHREF="quoting.html#WEIRDVARS">Example 5-1</A>.</P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="SCREEN"> <TTCLASS="PROMPT">bash$ </TT><TTCLASS="USERINPUT"><B>echo $IFS | cat -vte</B></TT> <TTCLASS="COMPUTEROUTPUT">$</TT> <TTCLASS="PROMPT">bash$ </TT><TTCLASS="USERINPUT"><B>bash -c 'set w x y z; IFS=":-;"; echo "$*"'</B></TT> <TTCLASS="COMPUTEROUTPUT">w:x:y:z</TT> </PRE></TD></TR></TABLE> </P><DIVCLASS="CAUTION"><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/caution.png"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><TTCLASS="VARNAME">$IFS</TT> does not handle whitespace the same as it does other characters. <DIVCLASS="EXAMPLE"><HR><ANAME="IFSH"></A><P><B>Example 9-1. $IFS and whitespace</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # $IFS treats whitespace differently than other characters. 3 4 output_args_one_per_line() 5 { 6 for arg 7 do echo "[$arg]" 8 done 9 } 10 11 echo; echo "IFS=\" \"" 12 echo "-------" 13 14 IFS=" " 15 var=" a b c " 16 output_args_one_per_line $var # output_args_one_per_line `echo " a b c "` 17 # 18 # [a] 19 # [b] 20 # [c] 21 22 23 echo; echo "IFS=:" 24 echo "-----" 25 26 IFS=: 27 var=":a::b:c:::" # Same as above, but substitute ":" for " ". 28 output_args_one_per_line $var 29 # 30 # [] 31 # [a] 32 # [] 33 # [b] 34 # [c] 35 # [] 36 # [] 37 # [] 38 39 # The same thing happens with the "FS" field separator in awk. 40 41 # Thank you, Stephane Chazelas. 42 43 echo 44 45 exit 0</PRE></TD></TR></TABLE><HR></DIV> </P></TD></TR></TABLE></DIV><P>(Thanks, S. C., for clarification and examples.)</P><P>See also <AHREF="communications.html#ISSPAMMER">Example 12-37</A> and <AHREF="loops.html#BINGREP">Example 10-7</A> for instructive examples of using <TTCLASS="VARNAME">$IFS</TT>.</P></DD><DT><TTCLASS="VARNAME">$IGNOREEOF</TT></DT><DD><P>ignore EOF: how many end-of-files (control-D) the shell will ignore before logging out.</P></DD><DT><TTCLASS="VARNAME">$LC_COLLATE</TT></DT><DD><P>Often set in the <TTCLASS="FILENAME">.bashrc</TT> or <TTCLASS="FILENAME">/etc/profile</TT> files, this variable controls collation order in filename expansion and pattern matching. If mishandled, <TTCLASS="VARNAME">LC_COLLATE</TT> can cause unexpected results in <AHREF="globbingref.html">filename globbing</A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -