internalvariables.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,354 行 · 第 1/4 页
HTML
3,354 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>内部变量</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="变量重游"HREF="variables2.html"><LINKREL="PREVIOUS"TITLE="变量重游"HREF="variables2.html"><LINKREL="NEXT"TITLE="操作字符串"HREF="string-manipulation.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="variables2.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">9. 变量重游</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="string-manipulation.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="INTERNALVARIABLES">9.1. 内部变量</A></H1><P></P><DIVCLASS="VARIABLELIST"><DL><DT><TTCLASS="REPLACEABLE"><I><AHREF="internal.html#BUILTINREF">内建</A>变量</I></TT></DT><DD><P>这些变量将会影响bash脚本的行为.</P></DD><DT><CODECLASS="VARNAME">$BASH</CODE></DT><DD><P><EM>Bash</EM>的二进制程序文件的路径 <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $BASH</KBD><SAMPCLASS="COMPUTEROUTPUT">/bin/bash</SAMP></PRE></FONT></TD></TR></TABLE> </P></DD><DT><CODECLASS="VARNAME">$BASH_ENV</CODE></DT><DD><P>这个<AHREF="othertypesv.html#ENVREF">环境变量</A>会指向一个Bash的启动文件, 当一个脚本被调用的时候, 这个启动文件将会被读取. </P></DD><DT><ANAME="BASHSUBSHELLREF"></A><CODECLASS="VARNAME">$BASH_SUBSHELL</CODE></DT><DD><P>这个变量用来提示<AHREF="subshells.html#SUBSHELLSREF">子shell</A>的层次. 这是一个Bash的新特性, 直到<AHREF="bashver3.html#BASH3REF">版本3</A>的Bash才被引入近来.</P><P>参考<AHREF="subshells.html#SUBSHELL">例子 20-1</A>中的用法.</P></DD><DT><CODECLASS="VARNAME">$BASH_VERSINFO[n]</CODE></DT><DD><P>这是一个含有6个元素的<AHREF="arrays.html#ARRAYREF">数组</A>, 它包含了所安装的Bash的版本信息. 这与下边的<CODECLASS="VARNAME">$BASH_VERSION</CODE>很相像, 但是这个更加详细一些.</P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><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 # 主版本号. 9 # BASH_VERSINFO[1] = 00 # 次版本号. 10 # BASH_VERSINFO[2] = 14 # 补丁次数. 11 # BASH_VERSINFO[3] = 1 # 编译版本. 12 # BASH_VERSINFO[4] = release # 发行状态. 13 # BASH_VERSINFO[5] = i386-redhat-linux-gnu # 结构体系 14 # (与变量$MACHTYPE相同).</PRE></FONT></TD></TR></TABLE> </P></DD><DT><CODECLASS="VARNAME">$BASH_VERSION</CODE></DT><DD><P>安装在系统上的Bash版本号</P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $BASH_VERSION</KBD><SAMPCLASS="COMPUTEROUTPUT">3.00.14(1)-release</SAMP> </PRE></FONT></TD></TR></TABLE> </P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">tcsh% </SAMP><KBDCLASS="USERINPUT">echo $BASH_VERSION</KBD><SAMPCLASS="COMPUTEROUTPUT">BASH_VERSION: Undefined variable.</SAMP> </PRE></FONT></TD></TR></TABLE> </P><P>检查$BASH_VERSION对于判断系统上到底运行的是哪个shell来说是一种非常好的方法. 变量<AHREF="internalvariables.html#SHELLVARREF">$SHELL</A>有时候不能够给出正确的答案. </P></DD><DT><ANAME="DIRSTACKREF"></A><CODECLASS="VARNAME">$DIRSTACK</CODE></DT><DD><P>在目录栈中最顶端的值. (将会受到<AHREF="internal.html#PUSHDREF">pushd</A>和<AHREF="internal.html#POPDREF">popd</A>的影响)</P><P>这个内建变量与<AHREF="internal.html#DIRSD">dirs</A>命令相符, 但是<BCLASS="COMMAND">dirs</B>命令会显示目录栈的整个内容. </P></DD><DT><CODECLASS="VARNAME">$EDITOR</CODE></DT><DD><P>脚本所调用的默认编辑器, 通常情况下是<BCLASS="COMMAND">vi</B>或者是<BCLASS="COMMAND">emacs</B>.</P></DD><DT><ANAME="EUIDREF"></A><CODECLASS="VARNAME">$EUID</CODE></DT><DD><P><SPANCLASS="QUOTE">"有效"</SPAN>用户ID</P><P>不管当前用户被假定成什么用户, 这个数都用来表示当前用户的标识号, 也可能使用<AHREF="system.html#SUREF">su</A>命令来达到假定的目的.</P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="VARNAME">$EUID</CODE>并不一定与<AHREF="internalvariables.html#UIDREF">$UID</A>相同.</P></TD></TR></TABLE></DIV></DD><DT><CODECLASS="VARNAME">$FUNCNAME</CODE></DT><DD><P>当前函数的名字</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><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值了. </PRE></FONT></TD></TR></TABLE> </P></DD><DT><CODECLASS="VARNAME">$GLOBIGNORE</CODE></DT><DD><P>一个文件名的模式匹配列表, 如果在<AHREF="globbingref.html">通配(globbing)</A>中匹配到的文件包含有这个列表中的某个文件, 那么这个文件将被从匹配到的结果中去掉.</P></DD><DT><ANAME="GROUPSREF"></A><CODECLASS="VARNAME">$GROUPS</CODE></DT><DD><P>目前用户所属的组</P><P>这是一个当前用户的组id列表(数组), 与记录在<TTCLASS="FILENAME">/etc/passwd</TT>文件中的内容一样. </P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo $GROUPS</KBD><SAMPCLASS="COMPUTEROUTPUT">0</SAMP><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo ${GROUPS[1]}</KBD><SAMPCLASS="COMPUTEROUTPUT">1</SAMP><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo ${GROUPS[5]}</KBD><SAMPCLASS="COMPUTEROUTPUT">6</SAMP> </PRE></FONT></TD></TR></TABLE> </P></DD><DT><ANAME="HOMEDIRREF"></A><CODECLASS="VARNAME">$HOME</CODE></DT><DD><P>用户的home目录, 一般是<TTCLASS="FILENAME">/home/username</TT>(参见<AHREF="parameter-substitution.html#EX6">例子 9-15</A>)</P></DD><DT><ANAME="HOSTNAMEREF"></A><CODECLASS="VARNAME">$HOSTNAME</CODE></DT><DD><P><AHREF="system.html#HNAMEREF">hostname</A>放在一个初始化脚本中, 在系统启动的时候分配一个系统名字. 然而, <CODECLASS="FUNCTION">gethostname()</CODE>函数可以用来设置这个Bash内部变量<CODECLASS="VARNAME">$HOSTNAME</CODE>. 参见<AHREF="parameter-substitution.html#EX6">例子 9-15</A>.</P></DD><DT><CODECLASS="VARNAME">$HOSTTYPE</CODE></DT><DD><P>主机类型</P><P>就像<AHREF="internalvariables.html#MACHTYPEREF">$MACHTYPE</A>, 用来识别系统硬件.</P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $HOSTTYPE</KBD><SAMPCLASS="COMPUTEROUTPUT">i686</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><ANAME="IFSREF"></A><CODECLASS="VARNAME">$IFS</CODE></DT><DD><P>内部域分隔符</P><P>这个变量用来决定Bash在解释字符串时如何识别域, 或者单词边界.</P><P>$IFS默认为<AHREF="special-chars.html#WHITESPACEREF">空白</A>(空格, 制表符,和换行符), 但这是可以修改的, 比如, 在分析逗号分隔的数据文件时, 就可以设置为逗号. 注意<AHREF="internalvariables.html#APPREF">$*</A>使用的是保存在<CODECLASS="VARNAME">$IFS</CODE>中的第一个字符. 参见<AHREF="quotingvar.html#WEIRDVARS">例子 5-1</A>.</P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $IFS | cat -vte</KBD><SAMPCLASS="COMPUTEROUTPUT">$</SAMP><SAMPCLASS="COMPUTEROUTPUT">(Show tabs and display "$" at end-of-line.)</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">bash -c 'set w x y z; IFS=":-;"; echo "$*"'</KBD><SAMPCLASS="COMPUTEROUTPUT">w:x:y:z</SAMP><SAMPCLASS="COMPUTEROUTPUT">(从字符串中读取命令, 并分配参数给位置参数.)</SAMP> </PRE></FONT></TD></TR></TABLE> </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="VARNAME">$IFS</CODE>处理其他字符与处理空白字符不同. <DIVCLASS="EXAMPLE"><HR><ANAME="IFSH"></A><P><B>例子 9-1. $IFS与空白字符</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # $IFS 处理空白与处理其他字符不同. 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:::" # 与上边一样, 但是用" "替换了":". 28 output_args_one_per_line $var 29 # 30 # [] 31 # [a] 32 # [] 33 # [b] 34 # [c] 35 # [] 36 # [] 37 # [] 38 39 # 同样的事情也会发生在awk的"FS"域中. 40 41 # 感谢, Stephane Chazelas. 42 43 echo 44 45 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV> </P></TD></TR></TABLE></DIV><P>(感谢, S. C., 进行了澄清与举例.)</P><P>参见<AHREF="communications.html#ISSPAMMER">例子 12-37</A>, <AHREF="loops1.html#BINGREP">例子 10-7</A>, 和<AHREF="x13628.html#MAILBOXGREP">例子 17-14</A> 都是展示如何使用<CODECLASS="VARNAME">$IFS</CODE>的例子.</P></DD><DT><CODECLASS="VARNAME">$IGNOREEOF</CODE></DT><DD><P>忽略EOF: 告诉shell在log out之前要忽略多少文件结束符(control-D). </P></DD><DT><CODECLASS="VARNAME">$LC_COLLATE</CODE></DT><DD><P>常在<TTCLASS="FILENAME">.bashrc</TT>或<TTCLASS="FILENAME">/etc/profile</TT>中设置, 这个变量用来控制文件名扩展和模式匹配的展开顺序. 如果$LC_COLLATE设置得不正确的话, <CODECLASS="VARNAME">LC_COLLATE</CODE>会在<AHREF="globbingref.html">文件名匹配(filename globbing)</A>中产生不可预料的结果.</P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?